Python Unicode编码错误

我正在阅读和parsing亚马逊XML文件,而当XML文件显示',当我尝试打印它时,我得到以下错误:

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

从我到目前为止在线阅读的内容来看,这个错误来源于XML文件是UTF-8,但是Python想要把它作为ASCII编码的字符来处理。 有没有一个简单的方法来使错误消失,并让我的程序打印XML,因为它读取?

有可能,你的问题是,你parsing它没关系,现在你试图打印XML的内容,你不能因为一些外国的Unicode字符。 尝试编码你的unicodestringascii第一:

 unicodeData.encode('ascii', 'ignore') 

“忽略”部分会告诉它跳过这些字符。 从python文档:

 >>> u = unichr(40960) + u'abcd' + unichr(1972) >>> u.encode('utf-8') '\xea\x80\x80abcd\xde\xb4' >>> u.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in ? UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128) >>> u.encode('ascii', 'ignore') 'abcd' >>> u.encode('ascii', 'replace') '?abcd?' >>> u.encode('ascii', 'xmlcharrefreplace') '&#40960;abcd&#1972;' 

您可能想要阅读这篇文章: http : //www.joelonsoftware.com/articles/Unicode.html ,我发现它非常有用,作为一个基本的教程。 读完之后,你会停止感觉你只是在猜测使用什么命令(或者至less发生在我身上)。

更好的解决scheme:

 if type(value) == str: # Ignore errors even if the string is not proper UTF-8 or has # broken marker bytes. # Python built-in function unicode() can do this. value = unicode(value, "utf-8", errors="ignore") else: # Assume the value object has proper __unicode__() method value = unicode(value) 

如果您想了解更多关于为什么:

http://docs.plone.org/manage/troubleshooting/unicode.html#id1

不要在您的脚本中硬编码您的环境的字符编码; 直接打印Unicode文本:

 assert isinstance(text, unicode) # or str on Python 3 print(text) 

如果你的输出被redirect到一个文件(或一个pipe道); 你可以使用PYTHONIOENCODING envvar来指定字符编码:

 $ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8 

否则, python your_script.py应该按原样工作 – 您的语言环境设置用于对文本进行编码(在POSIX检查: LC_ALLLC_CTYPELANG envvars – 如果需要,将LANG设置为utf-8语言环境)。

要在Windows上打印Unicode,请参阅此答案,其中显示了如何将Unicode打印到Windows控制台,文件或使用IDLE 。

我写了以下内容来解决非骚扰的引号和强制转换为可用的东西。

 unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", } def unicodeToAscii(inStr): try: return str(inStr) except: pass outStr = "" for i in inStr: try: outStr = outStr + str(i) except: if unicodeToAsciiMap.has_key(i): outStr = outStr + unicodeToAsciiMap[i] else: try: print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)" except: print "unicodeToAscii: unknown code (encoded as _)", repr(i) outStr = outStr + "_" return outStr 

尝试在Python脚本的顶部添加以下行。

 # _*_ coding:utf-8 _*_ 

优秀的职位: http : //www.carlosble.com/2010/12/understanding-python-and-unicode/

 # -*- coding: utf-8 -*- def __if_number_get_string(number): converted_str = number if isinstance(number, int) or \ isinstance(number, float): converted_str = str(number) return converted_str def get_unicode(strOrUnicode, encoding='utf-8'): strOrUnicode = __if_number_get_string(strOrUnicode) if isinstance(strOrUnicode, unicode): return strOrUnicode return unicode(strOrUnicode, encoding, errors='ignore') def get_string(strOrUnicode, encoding='utf-8'): strOrUnicode = __if_number_get_string(strOrUnicode) if isinstance(strOrUnicode, unicode): return strOrUnicode.encode(encoding) return strOrUnicode 

你可以使用某种forms

 s.decode('utf-8') 

它将一个UTF-8编码的string转换成一个Python Unicodestring。 但是确切的使用过程取决于你如何加载和parsingXML文件,例如,如果你没有直接访问XMLstring,你可能必须使用codecs模块中的解码器对象。

如果您需要将string的近似表示forms打印到屏幕上,而不是忽略那些unidecode打印的字符,请尝试在这里unidecode包:

https://pypi.python.org/pypi/Unidecode

解释在这里find:

https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

这比使用u.encode('ascii', 'ignore')给定的stringu更好,如果字符精度不符合你的要求,但是仍然希望具有可读性u.encode('ascii', 'ignore')u.encode('ascii', 'ignore')不必要的头痛。

Wirawan