2016-06-28 15 views
6

私はPython 3.5を使用していますが、特殊な中国語の文字が含まれている場合と含まれていない可能性があるバイトテキストのブロックを取得しようとしています。中国語の文字は含まれていませんが、漢字は壊れてしまいます。中国語の文字は常に人の名前であり、常にその名前の英語のスペルに加えてあります。テキストはJSON形式ですので、ロードする前にデコードする必要があります。デコードはうまくいくように見えますが、私にエラーはありません。私がしようとすると、ファイルにデコードされたテキストを書き込むとき、それは私に次のエラーメッセージが得られます。ここでは中国語の文字のPythonデコードの問題

UnicodeEncodeError: 'charmap' codec can't encode characters in position 14-18: character maps to undefined

を、私はそれに何かをする前に私が得る生データの例である:

b' "isBulkRecipient": "false",\r\n  "name": "Name in, English \xef' 
b'\xab\x62\xb6\xe2\x15\x8a\x8b\x8a\xee\xab\x89\xcf\xbc\x8a",\r\n 

recipientData = json.loads(recipientContent.decode('utf-8', 'ignore')) 
recipientName = recipientData['signers'][0]['name'] 
pprint(recipientName) 
with open('envelope recipient list.csv', 'a', newline='') as fp: 
    a = csv.writer(fp, delimiter=',') 
    csvData = [[recipientName]] 
    a.writerows(csvData) 

recipientContentは、APIの呼び出しから取得されます。

は、ここで私が使用していたコードです。出力ファイルに漢字を入れる必要はありません。アドバイスをいただければ幸いです!

更新:

私は壊し、各エントリのためのいくつかの手動の回避策をやって、そして中国の特殊文字が含まれていなかった他のエントリを来たが、他の言語からそれらを持っていた、とのようなプログラムを壊してきましたよく特殊文字は、名前フィールドにのみあります。だから、名前は "Ałex"のようなもので、通常の文字と特殊文字が混在しています。私はこの情報を含む文字列をデコードする前に、私はそれを画面に印刷することができます。このように見えます:b'name": "A\xc5ex",\r\n

しかし、私はそれをutf-8にデコードしてから、それ。エラーメッセージは次のとおりです。UnicodeEncodeError: 'charmap' codec can't encode character 'u0142' in position 2- character maps to -undefined-

私は\ u0142が何であったかを調べ、それは特殊文字です。

+0

例文字列はUTF-8(も共通の中国のマルチバイトのいずれかであることが表示されません。エンコード)。あなたはそれがUTF-8でエンコードされていると確信していますか? – univerio

+0

'Content-Type'をチェックする必要があります。もしそれが 'application/json; charset = utf-16'、 'utf-16'を使います。 'application/json'のデフォルトは' utf-8'です –

+0

Webサービスがデータを取得してもそれがうまく文書化されていないので、私はそのutf-8を100%確信していませんが、 utf-16を含むさまざまなエンコードタイプ私はそれに漢字が含まれていると確信しています。 –

答えて

0

警告:散弾銃のソリューションが先

あなただけ(つまり、彼らは他のすべてのフィールドのあなたの将来の処理のためには重要ではないです)、すべてのファイルにすべての外国文字を取り除きたい、あなたは、単にできると仮定すると、あなたはすべての非ASCII CHを削除し、このような

recipientData = json.loads(recipientContent.decode('ascii', 'ignore')) 

により、すべての非ASCII文字

recipientData = json.loads(recipientContent.decode('utf-8', 'ignore')) 

を無視将来の処理の前にアトラクター。

それは特定の状況下で正常に動作しない場合がありますので、私は散弾銃のソリューションと呼ん:

  1. 明らかb'\'またはb"の文字が一部から例えば表示された場合は非ASCII文字は、将来の使用のために
  2. を維持するために必要な場合utf-16文字の
0

エラーは、ファイルに書き込んだときに発生します。

Python 3。xの場合、encoding=を指定せずにテキストモードのopen()(デフォルト)を使用すると、Pythonはあなたのロケールや言語設定に最も適したエンコーディングを使用します。

Windowsの場合は、charmapコーデックを使用して言語エンコードにマップします。

バイトをファイルに直接書き込むことはできますが、最初にデコードして正しいことをしています。他の人が言っているように、Webサーバーで指定されたエンコーディングを使用して実際にデコードする必要があります。これを行うPython Requestsモジュールを使用することもできます。

すぐにエラーを解決するには、encodingopen()に渡すだけで、データに含まれている文字をサポートしています。 UTF-8エンコーディングでのUnicodeは当然の選択です。したがって、あなたが読んで、あなたのコードを変更する必要があります。

with open('envelope recipient list.csv', 'a', encoding='utf-8', newline='') as fp: 
0

あなたのコードに次の行を追加します。

from __future__ import unicode_literals 
+0

なぜそれが助けになるのですか? –

関連する問題