Python UnicodeDecodeError-我是不是误解了编码?

2024-05-23 20:39:19 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有想过为什么这不起作用?我真的认为“忽略”是正确的。

>>> '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)

Tags: toinaddmostcalllistencodefile
3条回答

这似乎有效:

'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-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,或者WindowsCP437,或者CP850,或者,或者,或者,取决于我们的系统默认值。

因此,当您在源代码中输入字符串“add”Monitoring to list(我想您希望字符串“add”Monitoring to list”,注意第二个引号)时,实际上您使用的字符串已经根据系统的默认代码页进行了编码(按字节计算,我假设您使用的是Windows代码页1252,“西部”)。如果你想从中得到Unicode,你需要从“cp1252”编码中解码字符串。

所以,你的意思是:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

不幸的是,Python2.x还为字符串包含了一个.encode方法;这是一个方便的函数,用于“特殊”编码,如“zip”或“rot13”或“base64”编码,与Unicode无关。

无论如何,您要记住的来回Unicode转换是:

  • Unicode字符串将编码为Python2.x字符串(实际上是一个字节序列)
  • Python 2.x字符串将解码为Unicode字符串

在这两种情况下,都需要指定要使用的编码

我不太清楚,我困了,但我希望我能帮忙。

一个幽默的旁注:玛雅人没有Unicode;古罗马人,古希腊人,古埃及人也没有。他们都有自己的“编码”,几乎不尊重其他文化。所有这些文明都化为乌有。想想吧,人们!为了人类的利益,让你的应用程序知道Unicode。:)

请不要用“但是中国人…”来破坏前面的信息。但是,如果您觉得有必要这样做,那么可以考虑Unicode BMP主要是由中文表意字符填充的,从而延迟它,因此中文是Unicode的基础。只要人们开发出支持Unicode的应用程序,我就可以继续编造离谱的谎言。干杯!

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

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

相关问题 更多 >