Python Unicode编码错误

时间:2010-07-11 19:00:48

标签: python unicode ascii encode

我正在阅读并解析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?

8 个答案:

答案 0 :(得分:180)

可能,你的问题是你解析它没关系,现在你正在尝试打印XML的内容而你不能因为有一些外来的Unicode字符。尝试首先将unicode字符串编码为ascii:

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

'ignore'部分会告诉它只是跳过这些字符。来自python docs:

>>> 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,我发现它非常有用,作为正在进行的基础教程。读完之后,你会觉得你只是猜测要使用什么命令(或者至少是发生在我身上的命令)。

答案 1 :(得分:15)

更好的解决方案:

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

答案 2 :(得分:5)

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

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

如果您的输出被重定向到文件(或管道);您可以使用PYTHONIOENCODING envvar来指定字符编码:

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

否则,python your_script.py应该按原样运行 - 您的区域设置用于对文本进行编码(在POSIX检查上:LC_ALLLC_CTYPELANG envvars - 如有必要,将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

答案 3 :(得分:1)

优秀的帖子: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

答案 4 :(得分:0)

您可以使用

形式的内容
s.decode('utf-8')

将UTF-8编码的字节串转换为Python Unicode字符串。但确切的使用过程取决于您如何加载和解析XML文件,例如如果您不直接访问XML字符串,则可能必须使用codecs module中的解码器对象。

答案 5 :(得分:0)

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

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

这里有解释:

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

这比使用u.encode('ascii', 'ignore')给定字符串u更好,并且如果字符精度不是您所追求的,但仍希望具有人类可读性,则可以避免不必要的麻烦。< / p>

Wirawan

答案 6 :(得分:0)

Python 3.5,2018

如果您不知道编码方式是什么,但是unicode解析器出现问题,可以在Notepad++中打开文件,然后在顶部栏中选择Encoding->Convert to ANSI。然后您可以像这样编写python

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

答案 7 :(得分:-1)

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

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