将整数转换为UTF-8(韩文)
我正在运行Ruby 1.9.2并尝试修复一些损坏的UTF-8文本输入,其中文本实际上是"\\354\\203\\201\\355\\221\\234\\353\\252\\205"
并将其更改为正确的韩语"상표명"
然而,经过一段时间的搜索和尝试一些方法,我仍然得到了胡言乱语。 令人困惑的是,第3行的转义字符示例运行正常
# encoding: utf-8 puts "상표명" # Target string # Output: "상표명" puts "\354\203\201\355\221\234\353\252\205" # Works with escaped characters like this # Output: "상표명" # Real input is a string input = "\\354\\203\\201\\355\\221\\234\\353\\252\\205" # After some manipulation got it into an array of numbers puts [354, 203,201,355,221,234,353,252,205].pack('U*').force_encoding('UTF-8') # Output: ŢËÉţÝêšüÍ (gibberish)
我确信这肯定已经在某个地方得到了解答,但我还没有找到它。
这是您想要获取UTF-8韩语文本的目的:
s = "\\354\\203\\201\\355\\221\\234\\353\\252\\205" k = s.scan(/\d+/).map { |n| n.to_i(8) }.pack("C*").force_encoding('utf-8') # "상표명"
这就是它的工作原理:
- 输入字符串很好且常规,因此我们可以使用
scan
来提取单个数字。 - 然后使用
to_i(8)
的map
将八进制值(由Henning Makholm指出to_i(8)
转换为整数。 - 现在我们需要将整数列表转换为字节,因此我们
pack('C*')
来获取字节字符串。 该字符串将具有BINARY
编码(AKAASCII-8BIT
)。 - 我们碰巧知道字节真的代表UTF-8所以我们可以强制使用
force_encoding('utf-8')
。
你缺少的主要是你的pack
格式; 'U'
表示“UTF-8字符”,并且期望一个Unicode代码点数组,每个代码点由一个整数表示, 'C'
需要一个字节数组,这就是我们所拥有的。
\354
等等是八进制转义,而不是十进制,所以你不能只将它们写成354来获取字节的整数值。