56

关于为什么这不起作用的任何想法?我真的认为“忽略”会做正确的事。

>>> 'add \x93Monitoring\x93 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)
4

4 回答 4

214

…它们被称为“编码”是有原因的…</p>

一点前言:将 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,或,或,或,取决于我们的系统默认值。

因此,当您在源代码中输入字符串“add “Monitoring” to list”(我认为您想要字符串“add “Monitoring” to list”时,请注意第二个引号),实际上您已经使用了一个字符串根据您系统的默认代码页编码(按字节 \x93 我假设您使用 Windows 代码页 1252,“Western”)。如果要从中获取 Unicode,则需要从“cp1252”编码中解码字符串。

所以,你的意思是:

"add \x93Monitoring\x94 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 的应用程序,我就可以继续编造令人发指的谎言。干杯!

于 2008-12-16T00:45:11.670 回答
4

encode 可用于 unicode 字符串,但您拥有的字符串似乎不是 unicode(尝试使用 u'add \x93Monitoring\x93 to list ')

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '
于 2008-12-15T16:02:02.617 回答
-2

神奇的线是:

unicodedata.normalize('NFKD', text).encode('utf-8', 'ignore')

在最需要时不会引发异常的一种衬里(删除错误的 Unicode 字符......)

于 2020-07-01T08:11:13.613 回答
-3

这似乎有效:

'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')

有什么问题吗?我想知道“忽略”、“替换”和其他此类编码错误处理何时出现?

于 2008-12-15T16:10:11.413 回答