Python 智能引号出现 UnicodeDecodeError

Python UnicodeDecodeError on smart quotes

我有一个 python 脚本,最近发现我在某些输入上遇到了一些编码错误。我注意到 "smart quotes" 引起了问题。我想知道如何克服这个问题的建议。我正在使用 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. 为什么 "smart quotes" 不能用 UTF-8 编码,UTF-8 是否还有其他限制,或者我完全误解了我所看到的内容?

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

Python 无法对字符串进行编码,因为它不知道其当前编码。您需要在 Python 2 中使用 u"’" 来告诉 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'只是胡乱猜测。您必须知道编码,否则可能会得到不正确的输出。