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

23

我正在尝试在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个回答

33

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

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

11

你特别提到了字节数组,但也许码点更适合:

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

我可能会在另一个项目中使用它,但对于这个项目,我首先使用字节数组,然后再转换回字符串。 - Charlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接