2010-10-29 104 views
6

我要讀,內容如下一些文本文件:轉換轉義Unicode字符串到它的字符紅寶石1.8

\涌十字u201CThe小販夫人\ U201D

在Ruby 1.9的終端,當我創建一個字符串與此內容:

ruby-1.9.1-p378 > "\u2714 \u2714 my great string \u2714 \u2714" 
=> "✔ ✔ my great string ✔ ✔" 

在紅寶石1.8,我沒有得到轉化爲他們的字符的Unicode代碼:

ree-1.8.7-2010.01 > "\u2714 \u2714 my great string \u2714 \u2714" 
=> "u2714 u2714 my great string u2714 u2714" 

有什麼簡單的方法可以在Ruby 1.8中返回正確的字符串字符嗎?

回答

5

最簡單的方法可能是使用JSON解析器,因爲JSON恰巧使用這個非常格式:

irb(main):014:0> JSON '["\u2714 \u2714 my great string \u2714 \u2714"]' 
=> ["\342\234\224 \342\234\224 my great string \342\234\224 \342\234\224"] 
6

對於別人誰在這個問題上絆倒(像我)尋找一個答案,相當於在Ruby 1.8中這樣做的方法是:

["2714".to_i(16)].pack("U*") 
1

這建立在@ Dave的答案上。我使用下面與相應的字符替換一個給定的字符串中的所有Unicode轉義序列:

string_value.gsub(/\\u([0-9a-fA-F]{4})/) {|m| [$1.hex].pack("U")} 

這是一個正則表達式查找「​​\ U」後面4個十六進制符號。然後它丟棄「\ u」,將4個十六進制符號轉換爲整數並使用pack獲取Unicode字符。它用相應的字符替換每個轉義序列並返回結果字符串。

如果您的字符串被進一步轉義(例如將「\」轉義爲「\\」),它會給您帶來麻煩。但在香草的情況下,它應該工作得很好。