将Python中的大128个字符从subprocess.popen()转换为在JSON中使用

时间:2013-05-26 02:09:27

标签: python unicode encoding

我在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。

3 个答案:

答案 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_asciiFalse,则结果可能包含非ASCII字符,返回值可能是unicode实例。

答案 2 :(得分:0)

@ Adam对str.decode的回答给了我一个提示。此外,pdfinfo程序感谢接受编码(-enc [encoding])参数的参数,因此我可以执行-enc UTF-8然后使用

raw_data.decode('UTF-8')
在Python中