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)
这很有效(直到这个智能引号问题)
我的两个问题是:
为什么 "smart quotes" 不能用 UTF-8 编码,UTF-8 是否还有其他限制,或者我完全误解了我所看到的内容?
我使用的方法(即使用我的自定义函数)是处理此问题的最佳方法吗?我尝试使用 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'
只是胡乱猜测。您必须知道编码,否则可能会得到不正确的输出。
我有一个 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)
这很有效(直到这个智能引号问题)
我的两个问题是:
为什么 "smart quotes" 不能用 UTF-8 编码,UTF-8 是否还有其他限制,或者我完全误解了我所看到的内容?
我使用的方法(即使用我的自定义函数)是处理此问题的最佳方法吗?我尝试使用 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'
只是胡乱猜测。您必须知道编码,否则可能会得到不正确的输出。