正規表現/\u(....)/
にはいくつか問題があります。すべての
まず、\u
あなたはそれが、1.9にエラーを取得しますないと1.8にそれだけではなく、あなたが探している\u
ペアよりも、単一u
にマッチすると思うように動作しません。 \u
を見つけるには/\\u/
を使用してください。
第2に、あなたの(....)
グループはあまりにも許容性があり、それは4文字を通り抜けることができ、それはあなたが望むものではありません。 1.9では、(\h{4})
(4桁の16進数)が必要ですが、1.8では([\da-fA-F]{4})
として\h
が必要です。
正規表現を1.8と1.9の両方で使用するには、/\\u([\da-fA-F]{4})/
を使用する必要があります。これは、1.8と1.9で、あなたに以下を与える:
>> 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!"
Unicode文字に進数をマングルするpack
とunpack
を使用して、おそらく十分ですが、より良い方法があるかもしれません。
そうです。それはRailsのActiveSupport :: JSONから来て、ActiveSupport :: JSONによってデコードされていますが、\ escapeを正しくデコードしていません。 (on Rails 2.1.2) –