猿问

智能引号上的 Python UnicodeDecodeError

我有一个 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 来捕捉智能引号的情况,但这没有用。


阿波罗的战车
浏览 130回答 1
1回答

慕尼黑8549860

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'这里只是随机猜测。您必须知道编码,否则冒着得到错误输出的风险。
随时随地看视频慕课网APP

相关分类

Python
我要回答