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


75

我正在使用xlrd解析xsl文件。大多数事情都运行良好。我有一本字典,其中的键是字符串,值是字符串列表。所有键和值都是unicode。我可以使用str()method打印大多数键和值。但是有些值具有unicode字符-\u2013为此,我得到了上面的错误。

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

提前致谢。

Answers:


78

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

这是非常全面的。谢谢。我有一个问题-可以说Twitter流,您不会预先知道编码。您将如何处理?
karthikr

@karthikr:我很难相信Twitter不提供编码。
Lennart Regebro

29

您也可以尝试此操作以获取文本。

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

1
经过多次SO搜索后,这为我解决了问题。由于Windows和Linux均抛出此编码错误,因此我的特殊用法是在印刷本中。
ddisqq

这将丢失任何非ASCII数据,正确的方法是使用正确的编码进行编码。
Padraic Cunningham

这将忽略非ASCII字符。您的答案仅仅是忽略问题?
John Strood '18年

如果您不使用非ASCII字符,则可以。
Pritesh Desai

为什么将字符串命名为“ foo”?
ghosh

7

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

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

进一步阅读


为什么将字符串命名为“ foo”?
ghosh

5

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

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

2

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

  1. 在您的Dockerfile的同一目录中创建一个文件并将其命名为default_locale,并在其中添加此行,

    环境= 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语言环境

    运行locale-gen en_CA.UTF-8

    COPY ./default_locale / etc / default / locale

    运行chmod 0755 / etc / default / locale

    ENV LC_ALL = zh_CA.UTF-8

    ENV LANG = en_CA.UTF-8

    ENV LANGUAGE = zh_CA.UTF-8

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


0

对我来说这有效

unicode(数据).encode('utf-8')

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.