【问题标题】:Converting UTF-16 to UTF-8将 UTF-16 转换为 UTF-8
【发布时间】:2015-09-21 07:46:12
【问题描述】:

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

print my_string
print binascii.hexlify(my_string)

我明白了:

2DF5
0032004400460035

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

2DF5
32444635

我试过了:

my_string.decode('utf-8')

哪个输出:

32004400460035

编辑:

这是一个简单的示例:

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

    hello = hello[2:].decode('utf-8')
    print hello
    print binascii.hexlify(hello)

产生这个输出:

��hello
fffe680065006c006c006f00
hello
680065006c006c006f00

预期的输出是:

��hello
fffe680065006c006c006f00
hello
68656c6c6f

【问题讨论】:

  • 这并不是一项艰巨的任务。你尝试过什么,你在哪里卡住了?
  • 另外,您有没有 BOM 的 UTF-16 数据。从前导空值来看,您有大端 UTF-16,但这可能只是部分数据?数据从何而来?
  • @MartijnPieters 更新了我的尝试。输出是从 Windows 上的程序生成的文件中加载的。
  • 那么如果数据被编码为 UTF-16,你为什么要把它解码为 UTF-8?解码需要字节并产生一个unicode 对象。
  • 您的输出也没有意义,因为您现在缺少 00 字节。

标签: python encoding utf-8 utf-16


【解决方案1】:

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

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

因此,要将其转换为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'

或者,一步完成:

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

【讨论】:

  • 但要考虑到实际数据中可能存在 BOM。
  • 谢谢,我不知道UTF-16be,这就是问题所在!
  • @Juicy:请注意,您的实际数据中有一个 BOM;当您有 BOM 时,无需选择 bele,只需解码为 UTF-16 然后 BOM 就不是解码值的一部分
  • @MartijnPieters 谢谢,TBH 我不经常编写这样的脚本,甚至不知道 BOM 是什么。我会在未来阅读它!
猜你喜欢
  • 2015-09-19
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2013-05-20
  • 2012-06-30
  • 2013-04-11
  • 2012-02-08
相关资源
最近更新 更多