如何在Ruby中把UCS-2字节数组转换为UTF-8字符串?

问题描述 投票:2回答:1

在Ruby中,我有一个UCS-2LE编码的字节数组,由于这是我对Ruby的一个完整的开始,我正在努力将它转换为UTF-8字符串,我在PHP & Java中也有同样的代码,但工作得很好。

在PHP中我使用iconv库,但是在Ruby中iconv已经被废弃了。

$str = iconv('UCS-2LE', 'UTF-8//IGNORE', implode($byte_array));

在Java中,我使用的是:

str = new String(byte_array, "UTF-16LE");

数组中的字节被编码为每1个字符2个字节,如何在Ruby中进行类似的转换?我试过一些解决方案,但对我来说并不奏效。谢谢你。

ruby unicode utf-8 string-conversion ucs2
1个回答
6
投票

假设是一个字节数组。

byte_array = [70, 0, 111, 0, 111, 0]

你可以使用 Array#pack 将整数值转换为字符(C 将每个整数视为一个无符号字符)。)

string = byte_array.pack("C*")       #=> "F\x00o\x00o\x00"

pack 返回一个ASCII-8BIT编码的字符串。

string.encoding                      #=> #<Encoding:ASCII-8BIT>

现在你可以使用 String#force_encoding 以将这些字节重新解释为UTF-16字符串。

string.force_encoding("UTF-16LE")    #=> "Foo"

到目前为止,字节没有改变。

string.bytes                         #=> [70, 0, 111, 0, 111, 0]

要将字符串转码成另一种编码,使用... String#encode:

utf8_string = string.encode("UTF-8") #=> "Foo"
utf8_string.bytes                    #=> [70, 111, 111]

整个转换过程可以写在一行中。

byte_array.pack("C*").force_encoding("UTF-16LE").encode("UTF-8")

或将源编码作为第二个参数传给 encode:

byte_array.pack("C*").encode("UTF-8", "UTF-16LE")
© www.soinside.com 2019 - 2024. All rights reserved.