Python中的Unicode utf-8/utf-16编码
在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 个回答
字符 U+3053 是“平假名字母 こ”。
在 UTF-16 的二进制格式中,开头的 \xff\xfe
是用来表示字节顺序的标记(U+FEFF),接着的 "S0" 是 \x5e\x30
,然后是原始字符串中的 \n
。注意,每个字符的字节顺序是“反转”的,因为它使用的是小端 UTF-16 编码。
而在 UTF-8 格式中,同样的平假名字符用三个字节表示,具体的位模式可以在这里查看。
至于你是否应该在数据集中包含这个字符……这些数据是从哪里来的?里面包含平假名字符合理吗?
你问:
u'\u3053\n'
这是不是utf-16编码?
答案是否定的:这是Unicode,不是某种特定的编码。utf-16是一种编码方式。
要在你的终端上正确显示Unicode字符串,你需要知道这个终端支持什么编码并能显示出来。例如,我笔记本上的Terminal.app设置为UTF-8,并且使用了丰富的字体,所以:
(来源: aleax.it)
...这个平假名字符显示得很正确。在我一台Linux工作站上,有个终端程序总是重置为Latin-1编码,这样会把字符搞得有点乱——我可以把它设置为utf-8,但字体里没有很多字形,所以它会显示一些没用的占位符字形。
这是一个Unicode字符,但在你的终端编码中似乎无法显示。print
会尝试用你终端的编码来处理这个Unicode对象,如果处理失败,就会出现错误。
在一个可以显示UTF-8的终端上,你会看到:
>>> print u'\u3053'
こ
你的终端似乎无法显示UTF-8字符,否则至少print a.encode("utf-8")
这一行应该能正确显示这个字符。