Python UnicodeDecodeError - 我误解了编码吗?

时间:2008-12-15 15:57:24

标签: python unicode ascii encode ignore

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

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

6 个答案:

答案 0 :(得分:208)

......他们之所以被称为“编码”......

一个小序言:将unicode视为常态或理想状态。 Unicode只是一个字符表。 №65是拉丁首都A.№937是希腊首都欧米茄。就是这样。

为了让计算机存储和操作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主要由中文表意文字填充来延迟它,ergo中文是Unicode的基础。只要人们开发支持Unicode的应用程序,我就可以继续发明令人发指的谎言。干杯!

答案 1 :(得分:4)

编码可用于unicode字符串,但你在那里的字符串似乎不是unicode(尝试使用u'add \ x93Monitoring \ x93列出')

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

答案 2 :(得分:0)

我还写了一篇关于这个主题的长篇博客:

The Hassle of Unicode and Getting on With It

答案 3 :(得分:-1)

遇到同样的问题;但是,无法理解如何正确地包含编码语法而不会产生更多错误或语法错误。

 genesis_block = {
    'hash': hash_function({
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    }),
    'contents': {
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    },
}

block_chain = [genesis_block]
chain_state = {'Tom': 10}

答案 4 :(得分:-2)

这似乎有效:

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

有什么问题吗?我想知道'ignore','replace'和其他类似的编码错误处理何时进来?

答案 5 :(得分:-2)

魔术线是:

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

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