我有一个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来捕获智能引号的情况,但这没有用。
答案 0 :(得分:0)
Python无法对字符串进行编码,因为它不知道其当前编码。您需要在Python 2中使用u"’"
来告诉Python这是一个Unicode字符串。 ({"\xe2"
恰好是此字符的UTF-8编码的第一个字节,但是Python并不知道它在UTF-8中,因为您没有告诉它。您可以输入{{1} }在文件顶部附近添加注释;或将字符明确表示为-*- coding: utf-8 -*-
。)
类似地,要转换从磁盘读取的字符串,必须强制转换为Unicode,以便随后可以将其编码为UTF-8。
u"\u2219"
当然,print(s.decode('iso-8859-1').encode('utf-8'))
只是随机猜测。您必须知道编码,否则可能会得到错误的输出。