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

Posted

技术标签:

【中文标题】UnicodeEncodeError:“ascii”编解码器无法在位置 3 2 编码字符 u\'\\u2013\':序数不在范围内(128)【英文标题】:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 3 2: ordinal not in range(128)UnicodeEncodeError:“ascii”编解码器无法在位置 3 2 编码字符 u'\u2013':序数不在范围内(128) 【发布时间】:2011-07-20 06:17:52 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

你也可以打印 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:我很难相信 Twitter 不提供编码。【参考方案2】:

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

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

further read

【讨论】:

【参考方案3】:

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

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

【讨论】:

经过多次 SO 搜索,这为我解决了问题。由于 Windows 和 Linux 都抛出了这个编码错误,我的特殊用法是打印出来的。 这将丢失任何非ascii的数据,正确的方法是使用正确的编码进行编码。 这将忽略非 ASCII 字符。你的回答只是忽略问题? 如果您不使用非 ASCII 字符,那么可以。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

对我来说这很有效

unicode(data).encode('utf-8')

【讨论】:

【参考方案6】:

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

    创建一个文件并将其命名为 default_locale 在你的 Dockerfile 的同一目录中,将这一行放入其中,

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

    将这些添加到您的 Dockerfile,

    运行 apt-get clean && apt-get update && apt-get install -y locales

    运行 locale-gen 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 时,这彻底解决了我的问题,希望这也能解决您的问题。

【讨论】:

【参考方案7】:

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

然后在代码中使用这个:

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

同样适用于所有有错误的 unicode。

【讨论】:

以上是关于UnicodeEncodeError:“ascii”编解码器无法在位置 3 2 编码字符 u'\u2013':序数不在范围内(128)的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeEncodeError: 'ascii' 编解码器无法编码字符 u'\u2026'

UnicodeEncodeError: 'ascii' 编解码器无法编码字符 u'\u2013'

UnicodeEncodeError:'ascii'编解码器无法对特殊名称的字符进行编码[重复]

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

UnicodeEncodeError:'ascii'编解码器无法在位置 3 编码字符 u'\ufffd':序数不在范围内(128)[重复]

UnicodeEncodeError:“ascii”编解码器无法在位置 126 编码字符 u'\u2019':序数不在范围内(128)