将整数转换为UTF-8(韩文)

时间:2011-08-27 01:34:35

标签: ruby 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)

我确信这肯定已经在某个地方得到了回答,但我还没有找到它。

2 个答案:

答案 0 :(得分:10)

这是您想要获取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')
# "상표명"

这就是它的工作原理:

  1. 输入字符串非常好且经常,因此我们可以使用scan来提取个别号码。
  2. 然后使用map to_i(8)八进制值(由Henning Makholm指出)转换为整数。
  3. 现在我们需要将整数列表转换为字节,以便我们pack('C*')获取字节字符串。此字符串将具有BINARY编码(AKA ASCII-8BIT)。
  4. 我们碰巧知道字节确实代表UTF-8所以我们可以用force_encoding('utf-8')强制解决问题。
  5. 您遗失的主要内容是pack格式; 'U'表示“UTF-8字符”,并且期望一个Unicode代码点数组,每个代码点由一个整数表示,'C'需要一个字节数组,这就是我们所拥有的。

答案 1 :(得分:2)

\354等等是八进制转义,而不是十进制,所以你不能把它们写成354来获取字节的整数值。