Python UnicodeDecodeError – 我误解编码?

任何想法,为什么这不工作? 我真的认为'忽略'会做正确的事情。

>>> '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可以用很多编码进行编码,编码的string可以解码为Unicode。 问题是,Unicode来得相当晚,所以我们所有使用8位字符集的人都学得太晚了,以至于我们一直使用编码的string。 编码可以是ISO8859-1,或者是Windows CP437或CP850,或者,或者,或者取决于我们的系统默认值。

所以,当你在源代码中inputstring“add”监听“列表”(我想你想要的string“添加”监测列表“,注意第二个引号),你实际上已经使用一个string编码根据您的系统的默认代码页(由字节\ x93我假设您使用Windows代码页1252,“西方”)。 如果你想从中得到Unicode,你需要解码来自“cp1252”编码的string。

那么,你的意思是:

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

不幸的是,Python 2.x也包含一个string的.encode方法。 这对于“特殊”编码来说是一个方便的function,就像“zip”或者“rot13”或者“base64”那样,它们与Unicode没有任何关系。

无论如何,所有你必须记住的来回Unicode转换是:

  • 一个Unicodestring被编码为一个Python 2.xstring(实际上是一个字节序列)
  • Python 2.xstring被解码为Unicodestring

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

我不是很清楚,我很困,但是我希望我能帮上忙。

PS幽默的一面注意:玛雅人没有Unicode; 古罗马人,古希腊人,古埃及人也没有。 他们都有自己的“编码”,对其他文化几乎没有尊重。 所有这些文明都被粉碎了。 想想看吧! 为了人类的利益,让您的应用程序能够识别Unicode。 🙂

PS2请不要破坏以前的信息,说“但是中国…”。 如果您觉得倾向于或有义务这么做,那么认为Unicode BMP主要是由中文字符填充的话,那么它就是Unicode的基础。 只要人们开发支持Unicode的应用程序,我就可以继续发明无耻的谎言。 干杯!

编码是可用的Unicodestring,但你有那里的string似乎不是unicode(尝试用u'add \ x93Monitoring \ x93列出)

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

我也写了一个关于这个主题的博客:

Unicode的麻烦和继续

这似乎工作:

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

任何问题呢? 我想知道什么时候“忽略”,“replace”和其他这样的编码error handling进来?