Ruby 1.9:将字节数组转换为具有多字节UTF-8字符的字符串
我试图在Ruby中找到一种方法,获取UTF-8字节数组并将其转换回字符串 在irb(Ruby 1.9.2预览版3)中,我可以从UTF-8字符串创建正确的字节数组:Ruby 1.9:将字节数组转换为具有多字节UTF-8字符的字符串,ruby,unicode,utf-8,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] 但是,我找不到从字节返回数组的方法。我尝试将Array.pack与U*选项一起使用,但这不适用于多字节字符 ruby-1.9.2-preview3 > [67, 97, 102,
ruby-1.9.2-preview3 > 'Café'.bytes.to_a
=> [67, 97, 102, 195, 169]
但是,我找不到从字节返回数组的方法。我尝试将Array.pack与U*选项一起使用,但这不适用于多字节字符
ruby-1.9.2-preview3 > [67, 97, 102, 195, 169].pack('U*')
=> "Café"
有没有人知道一种方法,可以将带有多字节字符的UTF-8字节数组转换回字符串
谢谢。这与
pack
如何解释其输入数据有关。您的示例中的U*
导致它将输入数据(我假设是在默认字符集中;我真的找不到这方面的任何文档)转换为UTF-8,从而使用双重编码。相反,只需打包字节并解释为UTF-8:
irb(main):010:0> [67, 97, 102, 195, 169].pack('C*').force_encoding('utf-8')
=> "Café"
您特别询问字节数组,但可能代码点更合适:
ar = 'Café'.codepoints.to_a
# => [67, 97, 102, 233]
ar.pack('U*')
# => Café
我可能会在另一个项目中使用它,但对于这个项目,我从字节数组开始,必须回到字符串。