Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 1.9:将字节数组转换为具有多字节UTF-8字符的字符串_Ruby_Unicode_Utf 8 - Fatal编程技术网

Ruby 1.9:将字节数组转换为具有多字节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中找到一种方法,获取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, 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é

我可能会在另一个项目中使用它,但对于这个项目,我从字节数组开始,必须回到字符串。