当前位置:  开发笔记 > 编程语言 > 正文

Python UnicodeDecodeError - 我误解了编码吗?

如何解决《PythonUnicodeDecodeError-我误解了编码吗?》经验,为你挑选了1个好方法。

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

>>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)

tzot.. 211

......他们被称为"编码"的原因......

一个小序言:将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,"西方").如果要从中获取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> tzot..:

......他们被称为"编码"的原因......

一个小序言:将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,"西方").如果要从中获取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的应用程序,我就可以继续发明令人发指的谎言.干杯!


25年的编程,10年的Python编程,这是我生命中第一次如此清楚地理解编码.
我认为从现在开始这应该是所有Python + Unicode问题的默认答案.
Unicode不仅仅是一个字符表,例如,单个抽象字符可以由一系列代码点表示:带有急性的拉丁大写字母g(对应的编码字符u"\ u01F4"或"Ǵ")由序列u"\ u0047\u0301"(或'Ǵ').http://is.gd/eTLi-
@JF Sebastian:不,Unicode不只是一个字符表.为了这个答案的目的,我过度简化了一些事情.
另外,我相信UTF-8使用1到6个字节.可能有2 ^ 32个字符,但编码本身有一些开销用于跟踪多字节序列长度.
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有