2

我在 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 中执行类似的转换?我尝试了一些解决方案,但它对我不起作用。谢谢你。

4

1 回答 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")
于 2014-07-23T16:47:25.840 回答