정규식 /\u(....)/
에 몇 가지 문제가 있습니다. 모든
첫째, \u
당신이 오류가 발생합니다 1.8에서 그냥 당신이 찾고있는 \u
쌍보다는 하나의 u
일치합니다 1.9 당신이 생각했던 방법을 작동하지 않습니다; 당신이 원하는 \u
리터럴을 찾으려면 /\\u/
을 사용해야합니다.
두 번째로, (....)
그룹은 지나치게 관용 적이기 때문에 4자를 통과 할 수 있으며 원하는 것은 아닙니다. 1.9에서는 (\h{4})
(4 자리 16 진수)를 원하지만, 1.8에서 ([\da-fA-F]{4})
으로 \h
이 필요합니다.
정규 표현식을 1.8과 1.9에서 모두 사용하려면 /\\u([\da-fA-F]{4})/
을 사용해야합니다. 유니 코드 문자로 16 진수를 난도질하는 pack
및 unpack
를 사용
>> s = 'Where is \u03bc pancakes \u03BD house? And u1123!'
=> "Where is \\u03bc pancakes \\u03BD house? And u1123!"
>> s.gsub(/\\u([\da-fA-F]{4})/) {|m| [$1].pack("H*").unpack("n*").pack("U*")}
=> "Where is μ pancakes ν house? And u1123!"
아마 충분하지만 더 나은 방법이있을 수있다 : 이것은 당신이 1.8 및 1.9에 다음을 제공합니다.
바로 당신입니다. 그것은 Rails의 ActiveSupport :: JSON에서 왔으며 ActiveSupport :: JSON으로 해독되었습니다. 그러나 이스케이프가 제대로 디코딩되지 않았습니다. (on Rails 2.1.2) –