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

>>> '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)
有帮助吗?

解决方案

……它们被称为“编码”是有原因的……

一点序言:将 unicode 视为规范或理想状态。Unicode 只是一个字符表。65 是拉丁大写字母 A。937 是希腊首都欧米茄。只是。

为了让计算机存储和/或操作 Unicode,它必须 编码 将其转换为字节。最直接的 编码 Unicode 是 UCS-4;每个字符占用4个字节,大约1000000个字符都可用。4 个字节包含 Unicode 表中字符的编号,作为 4 字节整数。另一种非常有用的编码是UTF-8,它可以用一到四个字节对任何Unicode 字符进行编码。但也有一些有限的编码,例如“latin1”,其中包含的字符范围非常有限,主要由西方国家使用。这样的 编码 每个字符仅使用一个字节。

基本上,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,以造福人类。:)

PS2 请不要说“但是中国人……”来破坏之前的信息。不过,如果您觉得倾向于或有义务这样做,请考虑 Unicode BMP 主要由汉字组成,因此中文是 Unicode 的基础,从而推迟它。只要人们开发支持 Unicode 的应用程序,我就可以继续发明令人发指的谎言。干杯!

其他提示

编码可用于unicode字符串,但你有串有似乎并不统一(与u'add \ x93Monitoring \ X93尝试列出“)

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '

这似乎工作:

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

用的任何问题?不知何时“忽略”,“替换”和其他这样的编码错误处理进来?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top