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

Bar*_*cik 2 ruby unicode ucs2 utf-8 string-conversion

我在Ruby中有一个UCS-2LE编码的字节数组,由于这是我从Ruby开始的全部内容,因此我正努力将其转换为UTF-8字符串,因此我在PHP和Java中使用相同的代码就可以了。

在PHP中,我使用的是iconv库,但在Ruby中,不赞成使用iconv:

$str = iconv('UCS-2LE', 'UTF-8//IGNORE', implode($byte_array));
Run Code Online (Sandbox Code Playgroud)

在Java中,我正在使用:

str = new String(byte_array, "UTF-16LE");
Run Code Online (Sandbox Code Playgroud)

数组中的字节编码为每1个字符2个字节,如何在Ruby中执行类似的转换?我已经尝试了一些解决方案,但对我而言不起作用。谢谢。

Ste*_*fan 5

假设一个字节数组:

byte_array = [70, 0, 111, 0, 111, 0]
Run Code Online (Sandbox Code Playgroud)

您可以用于Array#pack将整数值转换为字符(C将每个整数视为无符号字符):

string = byte_array.pack("C*")       #=> "F\x00o\x00o\x00"
Run Code Online (Sandbox Code Playgroud)

pack 返回具有ASCII-8BIT编码的字符串:

string.encoding                      #=> #<Encoding:ASCII-8BIT>
Run Code Online (Sandbox Code Playgroud)

现在,您可以String#force_encoding用来将字节重新解释为UTF-16字符串:

string.force_encoding("UTF-16LE")    #=> "Foo"
Run Code Online (Sandbox Code Playgroud)

到目前为止字节没有改变:

string.bytes                         #=> [70, 0, 111, 0, 111, 0]
Run Code Online (Sandbox Code Playgroud)

要将字符串转码为另一种编码,请使用String#encode

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

整个转换可以单行编写:

byte_array.pack("C*").force_encoding("UTF-16LE").encode("UTF-8")
Run Code Online (Sandbox Code Playgroud)