2012-06-22 48 views
1

試圖將rest_client GET的輸出轉換爲使用轉義序列表示的字符。在Ruby中將UTF-8值的匹配字符串轉換爲UTF-8字符

輸入:..."sub_id":"\u0d9c\u8138\u8134\u3f30\u8139\u2b71"...

(我把在 'all_subs')

比賽:m = /sub_id\"\:\"([^\"]+)\"/.match(all_subs.to_str) [1]

打印:puts m.force_encoding("UTF-8").unpack('U*').pack('U*')

,但它只是出來以同樣的方式,我把它。即,「\ u0d9c \ u8138 \ u3f30 \ u8139 \ u21b71」

但是,如果我轉換它的原始字符串:

puts "\u0d9c\u8138\u8134\u3f30\u8139\u2b71".unpack('U*').pack('U*')

輸出是完美的 「ග臉脴㼰脹⭱」

回答

0

什麼,當你解析輸入字符串你得到實際上是這樣的:

m = "\\u0d9c\\u8138\\u8134\\u3f30\\u8139\\u2b71" 

哪個不一樣:

"\u0d9c\u8138\u8134\u3f30\u8139\u2b71" 

因此一個選項是eval字符串,使紅寶石應用代碼點:

puts eval("\"#{m}\"") 
=> ග臉脴㼰脹 

但是注意,在運行時的eval有安全隱患。

如果字符串總是像你的例子。你也可以這樣做,這是安全的:

puts m.split("\\u")[1..-1].map { |c| c.to_i(16) }.pack("U*") 
=> ග臉脴㼰脹