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

2024-06-15 03:43:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

怎么回事?


Tags: 数据编码unicode解码utfencodeprintx00
3条回答

它是一个unicode字符,似乎无法在终端编码中显示。print尝试在终端的编码中对unicode对象进行编码,如果无法做到这一点,则会出现异常。

在可以显示utf-8的终端上,您可以得到:

>>> print u'\u3053'
こ

您的终端似乎无法显示utf-8,否则至少print a.encode("utf-8")行应该生成正确的字符。

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

UTF-16二进制格式开头的\xff\xfe位是编码字节顺序标记(U+FEFF),然后“S0”是\x5e\x30,然后是原始字符串的\n。(每个字符的字节都是“反向的”,因为它使用的是小尾数UTF-16编码。)

UTF-8表单用三个字节表示同一个平假名字符,位模式为documented here

现在,至于你是否真的应该把它放在你的数据集中。。。这些数据是从哪里来的?里面有平假名字符合理吗?

你问:

u'\u3053\n'

Is it utf-16?

答案是否定的:它是unicode,不是任何特定的编码。utf-16是一种编码。

要有效地将Unicode字符串打印到终端,您需要了解终端愿意接受并能够显示的编码。例如,我膝上型电脑上的Terminal.app设置为UTF-8,字体丰富,因此:

screenshot
(来源:aleax.it

…平假名字母显示正确。在Linux工作站上,我有一个终端程序,它会一直重置为Latin-1,这样它就会破坏一些与您类似的东西——我可以将它设置为utf-8,但它的字体中没有大量的字形,因此它会显示一些无用的占位符字形。

相关问题 更多 >