1
4

1 に答える 1

1

まず、明確化: あなたのアプローチはGB2312から ASCII に変換されません'╠µ╔Ý╩²¥¦┤ª└Ý│╠ð‗'decode返されるのは、ディスク上で直接表現できない一連の抽象文字です。エンコーディングはシリアライゼーション ルールです。この型はunicodePython 2 とstrPython 3 で呼び出されます。の型はstdoutPython str2 とbytesPython 3 になります。

raw バイトを に渡すjson.loadsと、utf-8 を使用して入力を文字列にデシリアライズ (デコード) しようとします。これにより、入力が別の互換性のないエンコーディングを使用してシリアル化されるため、表示されるエラーが発生します。最初に自分でデコードするのが正しいアプローチです。新しいバージョンの Python では、json.loadsとにかくこれを行う必要があります (厳密には、バイト シーケンスではなく文字シーケンスが必要です)。

注意点が 1 つあります。chardet のようにエンコーディングを推測するのは難しく、エラーが発生しやすい可能性があります。この特定のケースではたまたま機能しますが、他のファイルで同様のことを行う必要がある場合に機能するという保証はありません。これが最善の方法かもしれません。通常、ファイルのメタデータの早い段階でエンコーディングが記述されていることを期待しますが、この場合はそうではないようです。ただし、当て推量に頼る前に、常に信頼できる情報を見つけるようにしてください。

于 2013-11-07T00:56:44.923 に答える