UnicodeDecodeError
表示错误发生在解码的一个字节串到Unicode中。
>>> u"\N{EM DASH}".encode('utf-8').encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
u"\N{EM DASH}".encode('utf-8')
是一个字节串并调用.encode('utf-8')
的第二次导致了潜在隐性.decode(sys.getdefaultencoding())
:
特别是,如果你试图编码字节字符串代替Unicode字符串Python的2可能发生到UnicodeDecodeError
。
IDE做什么不同,它不会落在这个错误?
它可能工作在IDE因为它改变sys.getdefaultencoding()
到utf-8
你不应做。如您的问题所示,它可能会隐藏错误。在一般情况下,它也可能会破坏不希望Python的2
我同时编码unicode字符串非ASCII sys.getdefaultencoding()
第三方库,因为它是测试对像ñ另一个包含字母一根弦的唯一途径或ç。
您应该use unicodedata.normalize()
instead:
>>> import unicodedata
>>> a, b = u'\xf1', u'n\u0303'
>>> print(a)
ñ
>>> print(b)
ñ
>>> a == unicodedata.normalize('NFC', b)
True
注意:你的问题的代码可能会产生令人惊讶的结果:
#XXX BROKEN, DON'T DO IT
...address_name.upper() in i[5].upper().encode('utf-8')...
address_name.upper()
电话bytes.upper
方法而i[5].upper()
电话unicode.upper
方法。前者不支持Unicode,它可能取决于当前的语言环境,后者是更好,但执行不区分大小写的比较,使用.casefold()
方法代替:
key = unicode_address_name.casefold()
... if key == i[5].casefold()...
在一般情况下,如果需要unicode字符串,然后进行排序你可以使用icu.Collator
。比较默认的排序辞书:
>>> L = [u'sandwiches', u'angel delight', u'custard', u'éclairs', u'glühwein']
>>> sorted(L)
[u'angel delight', u'custard', u'gl\xfchwein', u'sandwiches', u'\xe9clairs']
与秩序en_GB
区域:
>>> import icu # PyICU
>>> collator = icu.Collator.createInstance(icu.Locale('en_GB'))
>>> sorted(L, key=collator.getSortKey)
[u'angel delight', u'custard', u'\xe9clairs', u'gl\xfchwein', u'sandwiches']
“直接”?你的意思是从命令提示符?什么OS?什么是您的控制台的编码? – 2010-10-20 14:53:14
我不知道Eclipse,但是你是什么意思“这是测试一个字符串与另一个字符串的唯一方法”?在现代Python中,如果你没有做输入或输出(来自文件,数据库或网络),即使在这种情况下许多API透明地处理unicode,你也不需要担心编码/解码。什么是GetValue()方法?哪个库? – 2010-10-20 14:55:33
Win-1252到UTF-8是一个严重的麻烦,我第二个Kelmer关于稳定编码的问题。 – 2010-10-20 15:09:47