Python UnicodeDecodeError - 我误解了编码吗?
- 2025-02-27 09:07:00
- admin 原创
- 52
问题描述:
您对为什么这不起作用有什么想法吗?我真的认为“忽略”会做正确的事。
>>> 'add x93Monitoringx93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
解决方案 1:
…它们被称为“编码”是有原因的……
先说一句:将 unicode 视为常态或理想状态。Unicode 只是一个字符表。第 65 号是拉丁大写字母 A。第 937 号是希腊大写字母 omega。就是这样。
为了让计算机存储和/或操作 Unicode,它必须将其编码为字节。Unicode 最直接的编码是 UCS-4;每个字符占用 4 个字节,所有 ~1000000 个字符都可用。4 个字节包含 Unicode 表中字符的编号,作为 4 字节整数。另一种非常有用的编码是 UTF-8,它可以用一到四个字节对任何 Unicode 字符进行编码。但也有一些有限的编码,如“latin1”,它包含的字符范围非常有限,主要用于西方国家。这种编码每个字符仅使用一个字节。
基本上,Unicode 可以用多种编码进行编码,编码的字符串可以解码为 Unicode。问题是,Unicode 出现得相当晚,所以我们所有从小使用 8 位字符集的人都太晚才知道,我们一直以来都在使用编码的字符串。编码可能是 ISO8859-1、Windows CP437、CP850,或者,或者,或者,这取决于我们的系统默认值。
因此,当您在源代码中输入字符串“将“Monitoring“添加到列表”时(我认为您想要字符串“将“Monitoring”添加到列表”,请注意第二个引号),您实际上正在使用已根据系统默认代码页编码的字符串(根据字节 ,我假设您使用 Windows 代码页 1252,“Western”)。如果您想从中获取 Unicode,则需要从“cp1252”编码中解码字符串。
所以,你想要做的是:
"add x93Monitoringx94 to list".decode("cp1252", "ignore")
不幸的是,Python 2.x.encode
也包含一个用于字符串的方法;这是一个用于“特殊”编码的便捷函数,例如“zip”或“rot13”或“base64”,它们与 Unicode 无关。
无论如何,在进行 Unicode 来回转换时,您需要记住的是:
Unicode 字符串被编码为 Python 2.x 字符串(实际上是字节序列)
Python 2.x 字符串被解码为 Unicode 字符串
在这两种情况下,您都需要指定将使用的编码。
我不是很清楚,我很困,但我确实希望我能有所帮助。
PS 一个有趣的旁注:玛雅人没有 Unicode;古罗马人、古希腊人、古埃及人也没有。他们都有自己的“编码”,对其他文化几乎没有尊重。所有这些文明都化为尘土。想想吧,人们!让你的应用程序支持 Unicode,造福人类。:)
PS2 请不要说“但是中文……”来破坏前面的信息。但是,如果您觉得有此倾向或有义务这样做,请推迟思考,认为 Unicode BMP 主要由汉字组成,因此中文是 Unicode 的基础。只要人们开发出支持 Unicode 的应用程序,我就可以继续编造荒谬的谎言。
解决方案 2:
编码可用于 unicode 字符串,但那里的字符串似乎不是 unicode(尝试使用 u'add Monitoring to list')
>>> u'add x93Monitoringx93 to list '.encode('latin-1','ignore')
'add x93Monitoringx93 to list '
解决方案 3:
神奇的一行是:
unicodedata.normalize('NFKD', text).encode('utf-8', 'ignore')
在最需要时不会引发异常的一行程序(删除错误的 Unicode 字符......)
解决方案 4:
这似乎有效:
'add x93Monitoringx93 to list '.decode('latin-1').encode('latin-1')
有什么问题吗?我想知道‘忽略’、‘替换’和其他类似的编码错误处理何时开始?
扫码咨询,免费领取项目管理大礼包!