1 に答える
まず、明確化: あなたのアプローチはGB2312
から ASCII に変換されません'╠µ╔Ý╩²¥¦┤ª└Ý│╠ð‗'
。decode
返されるのは、ディスク上で直接表現できない一連の抽象文字です。エンコーディングはシリアライゼーション ルールです。この型はunicode
Python 2 とstr
Python 3 で呼び出されます。の型はstdout
Python str
2 とbytes
Python 3 になります。
raw バイトを に渡すjson.loads
と、utf-8 を使用して入力を文字列にデシリアライズ (デコード) しようとします。これにより、入力が別の互換性のないエンコーディングを使用してシリアル化されるため、表示されるエラーが発生します。最初に自分でデコードするのが正しいアプローチです。新しいバージョンの Python では、json.loads
とにかくこれを行う必要があります (厳密には、バイト シーケンスではなく文字シーケンスが必要です)。
注意点が 1 つあります。chardet のようにエンコーディングを推測するのは難しく、エラーが発生しやすい可能性があります。この特定のケースではたまたま機能しますが、他のファイルで同様のことを行う必要がある場合に機能するという保証はありません。これが最善の方法かもしれません。通常、ファイルのメタデータの早い段階でエンコーディングが記述されていることを期待しますが、この場合はそうではないようです。ただし、当て推量に頼る前に、常に信頼できる情報を見つけるようにしてください。