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

时间:2011-03-22 07:09:20

标签: python

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

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

提前致谢。

7 个答案:

答案 0 :(得分:71)

你也可以打印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')

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

'\xe2\x80\x93'

你可以打印出来:

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

答案 1 :(得分:25)

您也可以尝试这样来获取文字。

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

答案 2 :(得分:7)

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

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

further read

答案 3 :(得分:5)

我遇到了同样的问题。这对我来说很好:

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

答案 4 :(得分:0)

对我来说这是有效的

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

答案 5 :(得分:0)

在最近的一个项目中,我确实遇到了这个问题,这确实给人带来痛苦。我终于发现这是因为我们在Docker中使用的Python编码为“ ansi_x3.4-1968”,而不是“ utf-8”。因此,如果有人在使用Docker并出现此错误,请按照以下步骤彻底解决您的问题。

  1. 在Dockerfile的同一目录中创建一个文件并将其命名为 default_locale

    environment = LANG =“ es_ES.utf8”,LC_ALL =“ es_ES.UTF-8”,LC_LANG =“ es_ES.UTF-8”

  2. 将这些添加到您的Dockerfile中,

    运行apt-get clean && apt-get update && apt-get install -y语言环境

    运行区域设置en_CA.UTF-8

    复制。/default_locale/ etc / default / locale

    运行chmod 0755 / etc / default / locale

    ENV LC_ALL = en_CA.UTF-8

    ENV LANG = en_CA.UTF-8

    ENV LANGUAGE = en_CA.UTF-8

当我再次构建并运行Docker时,这彻底解决了我的问题,希望也能解决您的问题。

答案 6 :(得分:0)

首先在这个链接中找出什么字符是unicode https://unicode-table.com/en/2013/

然后在代码中使用:

{your-string-variable}.replace(u"\u2013", "-")

对于所有有错误的 unicode 也是如此。