UnicodeEncodeError:'ascii'编解码器不能在位置3编码字符u'\ u2013'2:序号不在范围内(128)

我正在使用xlrdparsing一个xsl文件。 大部分的事情工作正常。 我有一个字典,其中键是string,值是string列表。 所有的键和值都是unicode。 我可以使用str()方法打印大部分的键和值。 但有些值具有unicode字符 – 我得到上述错误。

我怀疑这是因为这是unicodeembedded在unicode和python解释器无法解码它。 那么我怎样才能摆脱这个错误呢?

提前致谢。

你也可以打印Unicode对象,你不需要在它周围执行str()。

假设你真的想要一个str:

当您执行str(u'\ u2013')时,您正试图将Unicodestring转换为8位string。 要做到这一点,你需要使用编码,Unicode数据到8位数据之间的映射。 str()所做的是使用系统默认编码,在Python 2下是ASCII。 ASCII只包含127个Unicode的第一个代码点,即\ u0000到\ u007F1。 结果是你得到上面的错误,ASCII编解码器只是不知道是什么(这是一个很长的短跑,顺便说一句)。

因此您需要指定要使用的编码。 常见的是ISO-8859-1,通常被称为Latin-1,其中包含256个第一代码点; UTF-8可以通过使用可变长度编码,Windows上常见的CP1252以及各种中文和日文编码来编码所有的编码点。

你使用它们是这样的:

 u'\u2013'.encode('utf8') 

结果是一个包含一系列字节的str,它是所讨论字符的uTF8表示forms:

 '\xe2\x80\x93' 

你可以打印它:

 >>> print '\xe2\x80\x93' – 

你也可以尝试这个来获取文本。

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

因为这里str(u'\u2013')导致错误,所以使用isinstance(foo,basestring)来检查unicode / string,如果不是type base base转换成unicode然后apply encode

 if isinstance(foo,basestring): foo.encode('utf8') else: unicode(foo).encode('utf8') 

进一步阅读

我有同样的问题。 这工作对我来说很好:

 str(objdata).encode('utf-8')