我有一些python字符串形式的文本,代表外国名称:
Graziano Pellè
Sergio Agüero
Cesc Fàbregas
Run Code Online (Sandbox Code Playgroud)
我用语法编码字符串:
(string).encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
然而,这打印:
Graziano Pellè
Sergio Agüero
Cesc FÃ bregas
Run Code Online (Sandbox Code Playgroud)
当字符串打印到Command Shell和Python Shell时会发生这种情况,但我不明白为什么.我的印象是通用字符集支持来自大多数主要语言的字母表.如果这不是正确的编码,我应该使用什么?
谢谢
问题是你的终端窗口(我假设cmd.exe
,因为这听起来像Windows)不是UTF-8,而是像Windows-1252一样的类似Latin-1的字符集.
因此,您将这些Unicode字符串编码为UTF-8字节序列,然后将它们发送到终端,终端将这些UTF-8字节序列解释为它们是Windows-1252字节序列,并将它们显示为垃圾.
例如,u"Graziano Pellè"
当编码为UTF-8时,是:
'Graziano Pell\xc3\xa8'
Run Code Online (Sandbox Code Playgroud)
为什么?好吧,在UTF-8中,ASCII字符编码为一个字节,因此G
,也就是U + 0047,变成单个字节0x47
,看起来像G
几乎任何字符集,但是非ASCII字符编码为两个或更多字节,因此è
,又名U + 00E8,成为0xc3
和0xa8
.在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
.
归档时间: |
|
查看次数: |
1480 次 |
最近记录: |