Ruby 1.9:将字节数组转换为具有多字节UTF-8字符的字符串

时间:2010-12-13 20:18:08

标签: ruby unicode utf-8

我试图在Ruby中找到一种方法来获取UTF-8字节数组并将其转换回字符串。

在irb(Ruby 1.9.2预览版3)中,我可以从UTF-8字符串创建正确的字节数组:

ruby-1.9.2-preview3 > 'Café'.bytes.to_a
 => [67, 97, 102, 195, 169]

但是,我找不到从字节往返到数组的方法。我尝试使用带有U *选项的Array.pack,但这对多字节字符不起作用。

ruby-1.9.2-preview3 > [67, 97, 102, 195, 169].pack('U*')
 => "Café"

有没有人知道如何使用多字节字符获取UTF-8字节数组并将其转换回字符串?

感谢。

2 个答案:

答案 0 :(得分:31)

这与pack如何解释其输入数据有关。您的示例中的U*会导致转换输入数据(假设为默认字符集,我假设;我真的找不到任何此类文档)到UTF- 8,因此双重编码。相反,只需打包字节并解释为UTF-8:

irb(main):010:0> [67, 97, 102, 195, 169].pack('C*').force_encoding('utf-8')
=> "Café"

答案 1 :(得分:8)

你特别询问一个字节数组,但也许代码点更合适:

ar = 'Café'.codepoints.to_a
# => [67, 97, 102, 233]
ar.pack('U*')
# => Café