🐍 Python

ensure_ascii で日本語などの非ASCII文字の扱いを制御する

json.dumps()は既定で、日本語などのASCII範囲外の文字を\uXXXX形式にエスケープします。これはJSONとして正しい表現ですが、人間が見ると読みにくくなります。ensure_ascii=Falseを指定すると、元の文字のまま出力できます。

json.dumps(obj)                     # 既定(ensure_ascii=True): 非ASCII文字を\uXXXX形式にエスケープ
json.dumps(obj, ensure_ascii=False) # 非ASCII文字をそのまま出力
import json

data = {"name": "田中"}
print(json.dumps(data))
# {"name": "\u7530\u4e2d"} ← デフォルトはエスケープされる
import json

data = {"name": "田中"}
print(json.dumps(data, ensure_ascii=False))
# {"name": "田中"} ← 元の文字のまま出力される
# ensure_ascii=Trueは省略時のデフォルトと同じ結果になる
import json

data = {"name": "田中"}
print(json.dumps(data, ensure_ascii=True) == json.dumps(data))
# True
ensure_asciiの値による違い
True(既定)
非ASCII文字を\uXXXX形式のエスケープシーケンスに変換する。どの環境・文字コードでも安全に扱えるが、人間には読みにくい
False
非ASCII文字をそのまま出力する。人間が読みやすい反面、出力先のファイル・通信路が対応する文字コード(通常UTF-8)を扱える前提が必要
💡 AIコードレビュー観点:どちらもJSONとしては等価

\u7530のようなエスケープ表現と、実際の「田」という文字は、JSONの仕様上は完全に等価であり、json.loads()で読み込めばどちらも同じ文字列に戻ります。「日本語がエスケープされて読めない」という見た目上の問題に対して、AIが生成したコードを「壊れている」と誤解しないよう注意しましょう。人間が読むログやデバッグ出力に使うならensure_ascii=False、外部システムとの互換性を優先するなら既定のままが無難です。

← Python json クイックリファレンス一覧へ戻る / indent/sort_keysで整形出力する →