Python Unicode 编码错误

我正在读取和解析一个 Amazon XML 文件,当 XML 文件显示一个“时,当我试图打印它时,我得到以下错误:

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

从我到目前为止在线阅读的内容来看,这个错误来自于这样一个事实: XML 文件是 UTF-8格式的,但 Python 希望将其作为 ASCII 编码的字符来处理。有没有一种简单的方法可以消除错误并让我的程序在读取时打印 XML?

277287 次浏览

您可以使用表单中的某些内容

s.decode('utf-8')

它将 UTF-8编码的字节串转换为 Python Unicode 字符串。但是要使用的确切过程取决于加载和解析 XML 文件的确切方式,例如,如果您从来不直接访问 XML 字符串,那么您可能必须使用来自 codecs模块的解码器对象。

您的问题很可能是解析得很好,现在您试图打印 XML 的内容,但是由于存在一些 Unicode 外部字符而无法打印。首先尝试将 unicode 字符串编码为 ascii:

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

“忽略”部分会告诉它跳过这些字符:

>>> # Python 2: u = unichr(40960) + u'abcd' + unichr(1972)
>>> u = chr(40960) + u'abcd' + chr(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,我发现它作为一个关于正在发生的事情的基本教程非常有用。在阅读之后,您将不再感觉像是在猜测要使用什么命令(或者至少在我身上发生过这种情况)。

一个更好的解决方案:

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)

If your output is redirected to a file (or a pipe); you could use PYTHONIOENCODING envvar, to specify the character encoding:

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

否则,python your_script.py应该按原样工作——使用区域设置对文本进行编码(在 POSIX 检查中: LC_ALLLC_CTYPELANG envars ——必要时将 LANG设置为 utf-8区域设置)。

To print Unicode on Windows, see this answer that shows how to print Unicode to Windows console, to a file, or using IDLE.

I wrote the following to fix the nuisance non-ascii quotes and force conversion to something usable.

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

如果您需要在屏幕上打印字符串的近似表示形式,而不是忽略那些不可打印的字符,请在这里尝试 unidecode软件包:

Https://pypi.python.org/pypi/unidecode

这里可以找到解释:

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

这比对给定的字符串 u使用 u.encode('ascii', 'ignore')要好,并且如果字符精度不是您想要的,但仍然希望具有人类可读性,那么可以避免不必要的麻烦。

Wirawan

Python 3.5,2018 Python 3.5,2018

如果您不知道编码是什么,但 unicode 解析器有问题,您可以在 Notepad++中打开该文件,并在顶部栏中选择 Encoding->Convert to ANSI。然后你可以像这样写你的蟒蛇

with open('filepath', 'r', encoding='ANSI') as file:
for word in file.read().split():
print(word)