1

rest_clientGETからの出力をエスケープシーケンスで表される文字に変換しようとしています。

入力:..."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 \ u8134 \ u3f30 \ u8139\u2b71」

ただし、その生の文字列を変換すると、次のようになります。

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

出力は「ග脸脴㼰コー⭱」として完璧です

4

1 に答える 1

0

入力文字列を解析するときに得られるのは、実際には次のとおりです。

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

これは同じではありません:

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

したがって、1つのオプションはeval、rubyがコードポイントを適用するように文字列に適用することです。

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

ただし、evalを実行するとセキュリティに影響することに注意してください。

文字列が常にあなたの例のようである場合。安全な次のようなこともできます。

puts m.split("\\u")[1..-1].map { |c| c.to_i(16) }.pack("U*")
=> ග脸脴㼰脹
于 2012-06-22T15:27:51.220 に答える