【发布时间】: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)
这工作得很好(直到这个智能引号问题)
我的两个问题是:
为什么“智能引号”不能用 UTF-8 编码,UTF-8 是否还有其他限制,或者我完全误解了我所看到的内容?
我使用的方法(即使用我的自定义函数)是处理此问题的最佳方法吗?我尝试使用 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