sirius2wpで作った退避ファイルリスト、日本語のカテゴリーやファイル名があった場合に、サーバーにアップロックしたredirect_savelist.jsonの日本語がちゃんとアップされない件の対処の続き。
まず昨日の段階で、PCのJSONファイルに書き出すところで、ユニコードになっていたのは、json.dump()にパラメーターを追加してあげればUTF-8で日本語のまま出力されたのだが、それをそのままアップロードするのは、そもそも正しいのか?って思い直したところから。
ftpでバイナリーでアップすれば済む話なのかもしれないけど、CGIでアップロードするように修正するし、そうするとバイト列で扱えた方が間違いがないハズ。
ってことで、sirius2wp内でUTF-8をUnicodeにして、それだとバイト列なので、これをまた文字にする。つまりUnicodeのコードを表す文字列にしてredirect_savelist.jsonに格納する。
それをCGI側で逆のことをしてUTF-8に戻して、ちゃんと日本語として表示することまでできるようになった。
なったけど、日本語ファイル名のファイルのmove()はできないまま。
どうもosを通してファイルアクセスする場合、Python内での文字コード(UTF-8)とOS側というかPythonとOSの間のシェルなのかもしれないけど、そこで文字コードが合わないみたい。
UTF-8な日本語のファイル名をパラメーターにしたshutil.move()を実行した先で、
samefile s1 = os.stat(f1) UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 3-8: ordinal not in range(128)
ってエラーになるから、OS側は’ascii’ codecでエンコードしようとしているみたい。
Python CGI側では、UTF-8の日本語ファイル名をstdoutでは日本語で表示できるけど、ファイルへのファイル名には使えないってことになる。
逆にos.listdir()で取得したファイルリストに日本語ファイル名があった場合もprintで表示できずUTF-8のUnicodeEndodeエラーになる。
ちなみに、os.listdir()で取得したファイル名をprintせずにshutil.move()に渡すと移動は正常に行われるので、OSレベルでは文字コードが合っているんだろう。
OSが制御するファイルシステム内のファイル名の文字コードをUTF-8にすることができないと、いくらPythonで頑張ってもCGIから日本語ファイル名のファイルを扱えないってことだと想像する。
これは極めて深いところの話みたいな気がするので、深追いするのをあきらめた。
PythonのCGIを実行しているシェルの環境変数を何かに変えたら、UTF-8に合わせられるのかもしれないけど、今追求することじゃない。
退避ファイルの移動がツールで自動化できないけれど、手で移動させればいい話。
せっかく日本語ファイル名の表示はできるようになったから、退避ファイルの一覧だけは表示して、このファイルを退避させてね、ってCGIで表示するところでOKにする。
残念な判断ではあるけれど、凹むけど、ここはメインなことじゃない。
UnicodeとUTF-8な話は重要なことなので、今回調べて実験したことは別途記録しておこう。