【问题标题】:Python UnicodeDecodeError on smart quotes智能引号上的 Python UnicodeDecodeError
【发布时间】:2018-11-02 09:56:12
【问题描述】:

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

【问题讨论】:

  • 后续问题,因为我一直在尝试不同的东西,我应该“解码”然后“编码”吗?即 mystring.decode("utf-8").encode("utf-8")
  • 因为这是 Python 2,所以您的源字符串是字节字符串。但是encode 用于从 unicode 字节串,因此 Python 会自动尝试首先使用默认的 ASCII 解码器进行 decode - 因此会出现错误。但实际上,如果这是一个字节串,那么你根本不需要这样做。
  • 谢谢@DanielRoseman。问题是,如果我不使用encode,那么我会收到这样的错误 'ascii' codec can't encode character u'\u2019' in position 190: ordinal not in range(128)
  • 你从哪里得到的?你的实际代码在哪里?

标签: python python-2.7 python-unicode


【解决方案1】:

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

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

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

当然,这里'iso-8859-1' 只是一个随机猜测。您必须知道编码,否则可能会得到不正确的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2011-10-21
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多