我试图在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字节数组并将其转换回字符串?
感谢。
答案 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é