0

8 ビット文字セットの上半分の文字を含むテキストを返すxpdfプログラム pdfinfoを呼び出しsubprocess.popen()ています。

結果を 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 がそれを処理する方法を理解するのに役立つ適切な情報を追加する場所について、私は完全に混乱しています。


編集:入力が(または少なくとも私のソースコード)からのものであり、別のプロセスではない場合、Unicode文字列リテラルを使用できます

>>> json.dumps({'a':u'Adobe\u00ae'})
'{"a": "Adobe\\u00ae"}'

そしてPythonはそれをうまく処理します。

しかし、pdfinfo の出力を Unicode としてデコードするために Python に与えるヒントがわかりません。

4

3 に答える 3

2

まず、取得するデータの文字エンコーディングが何であるかを把握する必要があります。コードポイント0xAEに記号「®」があるのはWindows-1252だと思います。したがって、それをデコードするには、次のstr.decode関数を使用します。

raw_data = 'Adobe\xae'
decoded = raw_data.decode('Windows-1252')
print decoded  # Prints "Adobe®"
于 2013-05-26T02:16:27.453 に答える