9

在蟒蛇中:

u'\u3053\n'

是 utf-16 吗?

我并不真正了解所有 unicode/encoding 的东西,但是这种类型的东西正在我的数据集中出现,就像我有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

4 回答 4

10

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

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

>>> print u'\u3053'
こ

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

于 2009-08-04T19:35:04.923 回答
8

你问:

你'\u3053\n'

是 utf-16 吗?

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

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

截屏
(来源:alax.it

...平假名字母显示正确。在 Linux 工作站上,我有一个终端程序,它不断重置为 Latin-1,所以它会像你的那样破坏一些东西——我可以将它设置为 utf-8,但它的字体中没有大量的字形,所以相反,它会显示一些无用的占位符字形。

于 2009-08-05T02:15:58.420 回答
3

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

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

UTF-8 形式以三个字节表示相同的平假名字符,其位模式如此所述。

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

于 2009-08-04T19:37:58.020 回答
1

这是 Python 2.6.2 的 Unicode HowTo 文档:

http://docs.python.org/howto/unicode.html

另请参阅该文档参考部分中的链接以获取其他解释,包括 Joel Spolsky 的解释。

于 2009-08-04T19:33:30.090 回答