UnicodeEncodeError:'ascii'编解码器无法对位置3中的字符u'\ u2013'进行编码2:序数不在范围内(128)

Sum*_*mod 73 python

我正在使用xlrd解析xsl文件.大多数事情都很好.我有一个字典,其中键是字符串,值是字符串列表.所有键和值都是unicode.我可以使用str()方法打印大部分键和值.但是有些值具有unicode字符 - \u2013我得到了上述错误.

我怀疑这种情况正在发生,因为这是嵌入在unicode中的unicode,而python解释器无法对其进行解码.那我怎么能摆脱这个错误呢?

提前致谢.

Len*_*bro 76

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

假设你真的想要一个str:

当您执行str(u'\ u2013')时,您尝试将Unicode字符串转换为8位字符串.为此,您需要使用编码,即Unicode数据与8位数据之间的映射.str()的作用是使用系统默认编码,在Python 2下是ASCII.ASCII仅包含Unicode的127个第一个代码点,即\ u0000到\ u007F1.结果是你得到了上面的错误,ASCII编解码器只是不知道\ u2013是什么(这是一个很长的破折号,顺便说一下).

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

你像这样使用它们:

u'\u2013'.encode('utf8')
Run Code Online (Sandbox Code Playgroud)

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

'\xe2\x80\x93'
Run Code Online (Sandbox Code Playgroud)

你可以打印出来:

>>> print '\xe2\x80\x93'
–
Run Code Online (Sandbox Code Playgroud)


Pri*_*sai 28

您也可以尝试这个来获取文本.

foo.encode('ascii', 'ignore')
Run Code Online (Sandbox Code Playgroud)


Vas*_*han 7

因为这里str(u'\u2013')导致错误因此用于isinstance(foo,basestring)检查unicode/string,如果不是类型基本字符串将其转换为Unicode然后应用编码

if isinstance(foo,basestring):
    foo.encode('utf8')
else:
    unicode(foo).encode('utf8')
Run Code Online (Sandbox Code Playgroud)

进一步阅读


Moh*_*sen 5

我有同样的问题.这对我来说很好:

str(objdata).encode('utf-8')
Run Code Online (Sandbox Code Playgroud)