智能引号上的Python UnicodeDecodeError

时间:2018-11-02 09:56:13

标签: python python-2.7 python-unicode

我有一个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)

效果很好(直到此智能报价问题为止)

我有两个问题:

  1. 为什么“智能引号”不能用UTF-8编码,并且UTF-8还有其他限制,还是我完全误解了我所看到的内容?

  2. 我使用的方法(即使用我的自定义函数)是处理此问题的最佳方法吗?我尝试使用try / except来捕获智能引号的情况,但这没有用。

1 个答案:

答案 0 :(得分:0)

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

类似地,要转换从磁盘读取的字符串,必须强制转换为Unicode,以便随后可以将其编码为UTF-8。

u"\u2219"

当然,print(s.decode('iso-8859-1').encode('utf-8')) 只是随机猜测。您必须知道编码,否则可能会得到错误的输出。