我在xpdf程序pdfinfo上调用subprocess.popen()
,该程序返回的文本包括8位字符集上半部分的一些字符。
我将结果传递给JSON序列化程序,当它到达字符\xae
(®符号)时它会抱怨:
>>> import json
>>> json.dumps({'a':'Adobe\xae'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\app\python\2.7.3\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "c:\app\python\2.7.3\lib\json\encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "c:\app\python\2.7.3\lib\json\encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xae in position 5: invalid start byte
我该如何解决这个问题?我对编解码器完全感到困惑,我应该在哪里添加正确的信息来帮助Python弄清楚如何处理它。
编辑:如果输入来自 me (或至少是我的源代码),而不是另一个进程,我可以使用Unicode字符串文字
>>> json.dumps({'a':u'Adobe\u00ae'})
'{"a": "Adobe\\u00ae"}'
并且Python可以很好地处理它。
但我不知道是什么提示Python将pdfinfo的输出解码为Unicode。
答案 0 :(得分:2)
首先,您需要弄清楚您要获取的数据的字符编码是什么。我猜它是Windows-1252,在代码点0xAE处有“®”符号。因此,要解码它,您可以使用str.decode
函数:
raw_data = 'Adobe\xae'
decoded = raw_data.decode('Windows-1252')
print decoded # Prints "Adobe®"
答案 1 :(得分:1)
json编码有一个参数ensure_ascii
。
>>> json.dumps({'a':u'Adobe\u00ae'}, ensure_ascii=False)
u'{"a": "Adobe\xae"}'
>>> print json.dumps({'a':u'Adobe\u00ae'}, ensure_ascii=False)
{"a": "Adobe®"}
如果ensure_ascii
为False
,则结果可能包含非ASCII字符,返回值可能是unicode实例。
答案 2 :(得分:0)
@ Adam对str.decode的回答给了我一个提示。此外,pdfinfo
程序感谢接受编码(-enc [encoding]
)参数的参数,因此我可以执行-enc UTF-8
然后使用
raw_data.decode('UTF-8')
在Python中。