将 UTF-16 转换为 UTF-8

Jui*_*icy 3 python encoding utf-8 utf-16

我从文件中加载了一个字符串。当我打印出字符串时:

print my_string
print binascii.hexlify(my_string)
Run Code Online (Sandbox Code Playgroud)

我得到:

2DF5
0032004400460035
Run Code Online (Sandbox Code Playgroud)

意思是这个字符串是UTF-16. 我想将此字符串转换为,UTF-8以便上面的代码产生此输出:

2DF5
32444635
Run Code Online (Sandbox Code Playgroud)

我试过了:

my_string.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

哪个输出:

32004400460035
Run Code Online (Sandbox Code Playgroud)

编辑:

这是一个快速示例:

    hello = 'hello'.encode('utf-16')
    print hello
    print binascii.hexlify(hello)

    hello = hello[2:].decode('utf-8')
    print hello
    print binascii.hexlify(hello)
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

??hello
fffe680065006c006c006f00
hello
680065006c006c006f00
Run Code Online (Sandbox Code Playgroud)

预期输出将是:

??hello
fffe680065006c006c006f00
hello
68656c6c6f
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 5

您的字符串似乎已使用utf-16be以下编码:

In [9]: s = "2DF5".encode("utf-16be")
In [11]: print binascii.hexlify(s)
0032004400460035
Run Code Online (Sandbox Code Playgroud)

因此,为了将其转换为utf-8,您首先需要对其进行解码,然后对其进行编码:

In [14]: uni = s.decode("utf-16be")
In [15]: uni
Out[15]: u'2DF5'

In [16]: utf = uni.encode("utf-8")
In [17]: utf
Out[17]: '2DF5'
Run Code Online (Sandbox Code Playgroud)

或者,在一个步骤中:

In [13]: s.decode("utf-16be").encode("utf-8")
Out[13]: '2DF5'
Run Code Online (Sandbox Code Playgroud)

  • @Juicy:请注意,您的实际数据中*有 BOM*;当您有 BOM 时,无需选择“be”或“le”,只需解码为 UTF-16 *并且 BOM 不再是解码值的一部分*。 (2认同)