gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:13 25 4
gpt4 key购买 nike

我有一些代表外国名字的 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 字节序列,并将它们显示为垃圾。

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

'Graziano Pell\xc3\xa8'

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


此处的简单解决方案(如果您的 Python 能够正确检测终端的字符集)是直接打印 Unicode 字符串。

如果不是,您必须以某种方式查找字符集(或者只是硬编码它,如果这仅供本地使用;它可能是 cp1252 ,但您可以在系统偏好设置中找到它作为“OEM 代码页”) 并编码为那个,而不是 UTF-8。


最后一件事:

I was of the impression that the universal character set supports alphabets from most major languages.

确实如此。* 但问题是您不能只将 Unicode 写入控制台;你必须写字节。** 问题就变成了,哪些字节?如果您写入 UTF-8 字节,而终端期望 cp1252 字节,您会得到 mojibake。

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

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

关于python - .encode ('utf-8' ) 打印奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26027406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com