为了账号安全,请及时绑定邮箱和手机立即绑定

智能引号上的 Python UnicodeDecodeError

智能引号上的 Python UnicodeDecodeError

阿波罗的战车 2021-08-05 16:48:02
我有一个 python 脚本,最近注意到我在某些输入上遇到了一些编码错误。我注意到“智能报价”引起了问题。我想知道如何克服这个问题的建议。我正在使用Python 2,所以需要告诉我的脚本我想用 UTF-8 编码所有内容。我认为这样做就足够了:mystring.encode("utf-8")并且在很大程度上它有效,直到我遇到聪明的报价(并且可能还有许多其他事情会导致问题,因此我在这里发帖。)例如:mystring = "hi"mystring.encode("utf-8")输出是'hi'但为此:mystring2 = "’"mystring.encode("utf-8")输出是UnicodeDecodeError  Traceback (most recent call last)    <ipython-input-21-f563327dcd27> in <module>()    ----> 1 mystring.encode("utf-8")  UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in  position 0: ordinal not in range(128)我创建了一个函数来处理我得到的 JSON 输入(有时我得到 null/None值,有时我得到数值,虽然主要是 unicode,因此为什么我有几个 if 语句):def xstr(s):    if s is None:        return ''    if isinstance(s, basestring):        return str(s.encode("utf-8"))    else:        return str(s)这很有效(直到这个智能报价问题)我的两个问题是:为什么不能用 UTF-8 编码“智能引号”,UTF-8 是否还有其他限制,或者我是否完全误解了我所看到的?我使用的方法(即使用我的自定义函数)是处理这个问题的最佳方法吗?我尝试使用 try/except 来捕捉智能引号的情况,但这没有用。
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

Python 无法对字符串进行编码,因为它不知道其当前编码。您需要u"’"在 Python 2 中使用来告诉 Python 这是一个 Unicode 字符串。("\xe2"恰好是这个字符的 UTF-8 编码的第一个字节,但 Python 不知道它是 UTF-8,因为你没有告诉它。你可以-*- coding: utf-8 -*-在文件顶部附近放置一个注释;或者明确地将字符表示为u"\u2219".)

同样,要转换从磁盘读取的字符串,必须将其强制转换为 Unicode,然后才能编码为 UTF-8。

print(s.decode('iso-8859-1').encode('utf-8'))

当然,'iso-8859-1'这里只是随机猜测。您必须知道编码,否则冒着得到错误输出的风险。


查看完整回答
反对 回复 2021-08-05
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信