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)