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 ドキュメント
- Ensure_ascii がなぜこのように動作するのかについての情報: issue13769
ensure_ascii
2 つのことを行います。出力が有効な ASCII 文字であることを確認します (内部に Unicode が含まれている場合でも)。また、関数が Unicode オブジェクトを返すようにします。
つまり、私は次のように推測します。
- テキストを 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=False
がUnicodeDecodeErrror
Unicodeオブジェクトを返すため(JSONにエンコードする場合はmindblending)、デフォルトのエンコード(ascii)を使用してstrをUnicodeに変換することはできません。