Python中的Unicode utf-8/utf-16编码

11 投票
4 回答
70037 浏览
提问于 2025-04-15 13:22

在Python中:

u'\u3053\n'

这是utf-16吗?

我对所有的unicode和编码的东西不是很了解,但在我的数据集中出现了这种情况,比如我有 a=u'\u3053\n'

print 会报错,解码也会报错。

a.encode("utf-16") > '\xff\xfeS0\n\x00'
a.encode("utf-8") > '\xe3\x81\x93\n'

print a.encode("utf-8") > πüô
print a.encode("utf-16") >  ■S0

这是怎么回事呢?

4 个回答

3

字符 U+3053 是“平假名字母 こ”。

在 UTF-16 的二进制格式中,开头的 \xff\xfe 是用来表示字节顺序的标记(U+FEFF),接着的 "S0" 是 \x5e\x30,然后是原始字符串中的 \n。注意,每个字符的字节顺序是“反转”的,因为它使用的是小端 UTF-16 编码。

而在 UTF-8 格式中,同样的平假名字符用三个字节表示,具体的位模式可以在这里查看

至于你是否应该在数据集中包含这个字符……这些数据是从哪里来的?里面包含平假名字符合理吗?

8

你问:

u'\u3053\n'

这是不是utf-16编码?

答案是否定的:这是Unicode,不是某种特定的编码。utf-16是一种编码方式。

要在你的终端上正确显示Unicode字符串,你需要知道这个终端支持什么编码并能显示出来。例如,我笔记本上的Terminal.app设置为UTF-8,并且使用了丰富的字体,所以:

截图
(来源: aleax.it)

...这个平假名字符显示得很正确。在我一台Linux工作站上,有个终端程序总是重置为Latin-1编码,这样会把字符搞得有点乱——我可以把它设置为utf-8,但字体里没有很多字形,所以它会显示一些没用的占位符字形。

11

这是一个Unicode字符,但在你的终端编码中似乎无法显示。print会尝试用你终端的编码来处理这个Unicode对象,如果处理失败,就会出现错误。

在一个可以显示UTF-8的终端上,你会看到:

>>> print u'\u3053'
こ

你的终端似乎无法显示UTF-8字符,否则至少print a.encode("utf-8")这一行应该能正确显示这个字符。

撰写回答