JSONと日本語の文字コードな話(UTF-8とUnicode)

Pythonの中でデーターとして日本語を扱う場合、デフォルトはUTF-8になる。

ただJSON形式にしたデーターを出力する場合は、Unicodeエスケープされたバイト列になってしまう。
これはファイルに書いた場合も同様。

なので、Pythonから書き込んだファイルをエディターで開いても、日本語では表示されない。

おそらくhttpでアップロードやダウンロードした場合やWebAPIで取得も、ケアをしなければ、Unicodeエスケープされたバイト列になっているはず。

sirius2wpでは、リダイレクトとか退避ファイル名に日本語を使うことがあり、それらの日本語はPC側で作ったJSONファイルからサーバーへアップして、CGIで使うことになるので、双方でちゃんとケアしてUTF-8の日本語に戻せるようにする必要がある。

単にJSONデーターをファイルに書く際にUTF-8のまま書き込みたいのであれば、

とensure_ascii=Falseを追加すればいいらしい。
ただ、結局サーバーにCGIでアップロードすると、そこでUnicodeになってしまうので、今回はこれじゃ足らない。

ということで、意識してUTF-8とUnicodeをデコード/エンコードしながら使わないといけない。

単純にUTF-8の日本語をUnicodeにするにはエンコード。’unicode-escape’をパラメーターに付ける。
‘unicode-escape’を付けないと、単にただのバイト列になる。

これをUTF-8に戻すには、

とする。

ただ(本来は必要ないのかもしれないけど)文字コードとしてアップロードしたかったので、Unicodeエスケープされたバイト列をUnicodeを表す文字列にする。

そのためのencode()/decode()をする。

とすることで、バイト列がUnicodeをコードを表したUTF-8の文字列になる。

これをCGI側でUTF-8な日本語の文字列に戻す際はこうなる。

ちなみに、json.load(), json.loads()は、Unicodeエスケープされたバイト列をUTF-8にデコードしてくれる(らしい)。
なので、ローカル上でJSONファイルの読み書きするだけなら、かつjson.load(), json.loads()でJSON化するならUnicodeエスケープされたバイト列のことは意識することはないらしい。

タイトルとURLをコピーしました