Pythonの中でデーターとして日本語を扱う場合、デフォルトはUTF-8になる。
ただJSON形式にしたデーターを出力する場合は、Unicodeエスケープされたバイト列になってしまう。
これはファイルに書いた場合も同様。
なので、Pythonから書き込んだファイルをエディターで開いても、日本語では表示されない。
おそらくhttpでアップロードやダウンロードした場合やWebAPIで取得も、ケアをしなければ、Unicodeエスケープされたバイト列になっているはず。
sirius2wpでは、リダイレクトとか退避ファイル名に日本語を使うことがあり、それらの日本語はPC側で作ったJSONファイルからサーバーへアップして、CGIで使うことになるので、双方でちゃんとケアしてUTF-8の日本語に戻せるようにする必要がある。
単にJSONデーターをファイルに書く際にUTF-8のまま書き込みたいのであれば、
1 2 |
with open('test.json', 'w') as f: json.dump(jsondate, f, indent=2, ensure_ascii=False) |
とensure_ascii=Falseを追加すればいいらしい。
ただ、結局サーバーにCGIでアップロードすると、そこでUnicodeになってしまうので、今回はこれじゃ足らない。
ということで、意識してUTF-8とUnicodeをデコード/エンコードしながら使わないといけない。
単純にUTF-8の日本語をUnicodeにするにはエンコード。’unicode-escape’をパラメーターに付ける。
‘unicode-escape’を付けないと、単にただのバイト列になる。
1 2 |
savename ='日本語の文字列' uni_b_savename = savename.encode('unicode-escape') |
これをUTF-8に戻すには、
1 |
uni_b_savename.decode('unicode-escape') |
とする。
ただ(本来は必要ないのかもしれないけど)文字コードとしてアップロードしたかったので、Unicodeエスケープされたバイト列をUnicodeを表す文字列にする。
そのためのencode()/decode()をする。
1 2 3 |
savename ='日本語の文字列' uni_b_savename = savename.encode('unicode-escape') uni_str_savename = uni_b_savename.decode('utf-8') |
とすることで、バイト列がUnicodeをコードを表したUTF-8の文字列になる。
これをCGI側でUTF-8な日本語の文字列に戻す際はこうなる。
1 |
name = uni_str_savename.encode().decode('unicode-escape') |
ちなみに、json.load(), json.loads()は、Unicodeエスケープされたバイト列をUTF-8にデコードしてくれる(らしい)。
なので、ローカル上でJSONファイルの読み書きするだけなら、かつjson.load(), json.loads()でJSON化するならUnicodeエスケープされたバイト列のことは意識することはないらしい。