我在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中执行类似的转换?我尝试了一些解决方案,但它对我不起作用。谢谢。
答案 0 :(得分:4)
假设一个字节数组:
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")