json.dumps をensure_ascii=True で使用する 質問する

json.dumps をensure_ascii=True で使用する 質問する

json.dumpsのデフォルトを使用する場合ensure_ascii、次のようTrueに設定し続けることになりますFalse

  • 一緒に仕事をするなら、unicodeそれをパスしないとstrが返ってきます
  • 作業する場合は、str文字がUnicode(str内でエンコード)に変換されないように渡す必要があります。

どのようなシナリオでそれを望みますかTrue? そのオプションの使用例は何ですか?

ドキュメントより:

Ensure_ascii が true (デフォルト) の場合、出力内のすべての非 ASCII 文字は \uXXXX シーケンスでエスケープされ、結果は ASCII 文字のみで構成される str インスタンスになります。

それのメリットは何ですか?

ベストアンサー1

@user2357112 に感謝します。

まず理解すべきことは、JSON にはバイナリ表現がないということです。したがって、すべての文字列は有効な Unicode ポイントである必要があります。生のバイトを json.dumps しようとしている場合は、何か間違っている可能性があります。

次に、次の点を確認します。

つまり、私は次のように推測します。

  • テキストを JSON にエンコードしていて、すべての文字列が Unicode である場合は を使用しても問題ありませんensure_ascii=Falseが、実際には true のままにして str をデコードする方が理にかなっている可能性があります。(仕様によると、ダンプは Unicode を返すことを保証しませんが、Unicode を渡すとそれを返します。
  • str オブジェクトを扱っている場合、ensure_ascii=False を呼び出すと、json が文字を Unicode に変換するのを防ぐことができます。これは望ましいことだと思うかもしれませんが、たとえばブラウザで読み込もうとすると、奇妙なことが起こる可能性があります。

Ensure_ascii が結果にどのような影響を与えるかについては、次の表が役立つかもしれません。

+-----------------------+--------------+------------------------------+
|         Input         | Ensure_ascii |            output            |
+-----------------------+--------------+------------------------------+
| u”汉语”                | True         | '"\\u6c49\\u8bed"'           |
| u”汉语”                | False        | u'"\u6c49\u8bed"'            |
| u”汉语".encode("utf-8")| True         | '"\\u6c49\\u8bed"’           |
| u”汉语".encode("utf-8")| False        | '"\xe6\xb1\x89\xe8\xaf\xad"' |
+-----------------------+--------------+------------------------------+

最後の値は、バイトに UTF-8 でエンコードされた Unicode であることに注意してください。これは、他の JSON デコーダーでは解析できない可能性があります。

さらに、タイプ(Unicodeとstrの配列)を混在させて使用すると、モジュールensure_ascii=FalseUnicodeDecodeErrrorUnicodeオブジェクトを返すため(JSONにエンコードする場合はmindblending)、デフォルトのエンコード(ascii)を使用してstrをUnicodeに変換することはできません。

おすすめ記事