'ascii'编解码器无法对第*个字符进行编码,ord不在范围内(128)

10

在stackoverflow上有一些关于这个问题的帖子,但我没有找到一个有效的解决方案。

我从urllib read函数中收集了大量的文本数据,并将其存储在pickle文件中。

现在我想将这些数据写入文件。在写入时,我遇到了类似于以下的错误 -

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128)

很多数据正在丢失。

我猜urllib读取的数据是字节数据。

我已经尝试过

   1. text=text.decode('ascii','ignore')
   2. s=filter(lambda x: x in string.printable, s)
   3. text=u''+text
      text=text.decode().encode('utf-8')

但我仍然遇到类似的错误。有人能指出一个正确的解决方案吗?此外,编解码器是否有效?如果冲突字节不以字符串形式写入文件,则对其进行损失是可以接受的。


1
你能展示一下 text 中的内容吗? - Josh Lee
2个回答

11

您可以通过Django模块的smart_str来实现。只需尝试以下内容:

from django.utils.encoding import smart_str, smart_unicode

text = u'\u2019'
print smart_str(text)
你可以通过以管理员权限启动命令行并运行以下命令来安装Django:

python -m pip install Django

pip install Django

结果与encode('ascii','ignore')惊人地相似。 - minocha
1
两年过去了,我可以说这个答案对于Python2.7是多么重要,抱歉之前的不考虑他人感受的评论。 - minocha

9

2
也许还有向Unicode打招呼(无耻的宣传 :-)) - Kos
@martijn-pieters 我注意到在向数据库写入时我使用了编码函数。而在将内容再次转储到文本文件时,我又不必要地进行了编码解码操作。然而,由于 UTF-8 和 UTF-16 的冲突,可能会出现一些错误。你有什么解决方案建议吗? - minocha
@martjin-pieters - 你有什么想法,如果错误仍然存在,我应该怎么办? - minocha
@minocha:仔细阅读相关文章以及你所使用的数据库的文档。也许该数据库本身就原生支持Unicode。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接