关于python:UnicodeEncodeError:’ascii’编解码器无法编码位置3的字符u’ – ‘2:序数不在范围内(128)

UnicodeEncodeError: 'ascii' codec can't encode character u'u2013' in position 3 2: ordinal not in range(128)

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

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

提前致谢。


您也可以打印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,以及各种中文和日文编码。

你像这样使用它们:

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

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

1
'\xe2\x80\x93'

你可以打印出来:

1
2
>>> print '\xe2\x80\x93'


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

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


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

1
2
3
4
if isinstance(foo,basestring):
    foo.encode('utf8')
else:
    unicode(foo).encode('utf8')

进一步阅读


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

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


对我来说这很有效

的unicode(数据).encode( 'UTF-8')