.encode('utf-8') 打印奇怪的字符



我有一些python字符串形式的文本,表示外来名称:

Graziano Pellè
Sergio Agüero
Cesc Fàbregas

我用语法对字符串进行编码:

(string).encode('utf-8')

然而,这会打印:

Graziano Pellè
Sergio Agüero
Cesc Fàbregas

当字符串同时打印到Command Shell和Python Shell时会发生这种情况,但我不明白为什么。我的印象是,通用字符集支持大多数主要语言的字母表。如果这不是要使用的正确编码,我应该使用什么?

感谢

问题是您的终端窗口(我假设cmd.exe,因为这听起来像Windows)不是UTF-8,而是一些类似Latin-1的字符集,如Windows-1252。

因此,您将这些Unicode字符串编码为UTF-8字节序列,然后将其发送到终端,终端将这些UTF-8字节序列解释为Windows-1252字节序列,并将其显示为垃圾。

例如,当编码为UTF-8时,u"Graziano Pellè"是:

'Graziano Pellxc3xa8'

为什么?好吧,在UTF-8中,ASCII字符编码为一个字节,所以G,又名U+0047,变成了单字节0x47,在几乎任何字符集中看起来都像G,但非ASCII字符编码到两个或更多个字节,因此è,又名U+000E8,变成了0xc30xa8。在Windows-1252中,0xc3是字符Ã0xa8是字符¨


如果Python正确地检测到了终端的字符集,那么简单的解决方案就是直接打印Unicode字符串。

如果没有,您必须以某种方式查找字符集(或者只是硬编码,如果这只是本地使用的话;它可能是cp1252,但您可以在系统首选项中找到它作为"OEM代码页"),并将其编码为该字符集,而不是UTF-8。


最后一件事:

我的印象是,通用字符集支持大多数主要语言的字母表。

确实如此。*但问题是,你不能只在控制台中编写Unicode;你必须写字节。**问题变成了,哪些字节?如果您编写UTF-8字节,而终端需要cp1252字节,那么您将获得mojibake。

*实际上,"通用字符集"通常指ISO-60464或UCS 2,而不是现代Unicode……但它们对于前61K个字符左右是相同的,所以让我们假设它足够接近…

**这在Windows上实际上不是真的;您可以改为编写16位字,并且它们保证被解释为UTF-16。但是Python 2.x不知道如何以这种方式使用Windows控制台,所以这对您没有帮助,除非您想开始直接进行Win32 API调用,而不是使用像print这样友好的东西

最新更新