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

Cha*_*lie 21 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]
Run Code Online (Sandbox Code Playgroud)

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

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

有没有人知道一种方法来获取具有多字节字符的UTF-8字节数组并将其转换回字符串?

谢谢.

Jak*_*org 32

这与如何pack解释其输入数据有关.在U*你的榜样使其转化输入数据(假设为一个默认的字符集,我想,我真的找不到这个任何文件)为UTF-8,因此双编码.相反,只需打包字节并解释为UTF-8:

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


ste*_*lag 8

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

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