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

Posted

技术标签:

【中文标题】Ruby 1.9:将字节数组转换为具有多字节 UTF-8 字符的字符串【英文标题】:Ruby 1.9: Convert byte array to string with multibyte UTF-8 characters 【发布时间】:2011-05-24 21:39:42 【问题描述】:

我正在尝试在 Ruby 中找到一种方法来获取 UTF-8 字节数组并将其转换回字符串。

在 irb (Ruby 1.9.2 preview 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 字节数组并将其转换回字符串?

谢谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您专门询问了字节数组,但也许代码点更合适:

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

【讨论】:

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

以上是关于Ruby 1.9:将字节数组转换为具有多字节 UTF-8 字符的字符串的主要内容,如果未能解决你的问题,请参考以下文章

ruby 1.9 中有没有办法从字符串中删除无效的字节序列?

ruby 1.9:UTF-8 中的无效字节序列

将字节数组转换为十进制

将字节数组转换为java类型

将人类可读的文件大小转换为 ruby​​ 中的字节

windows下多字节和宽字节转换