サーバー上で日本語のファイル名にアクセスする方法

sirius2wpでWordPressをアクティベートする際にSIRIUSのオリジナルファイルを退避させるところで起きた問題。

shutil.move()で移動させるときに、日本語のファイル名があった場合にCGI側から指定した日本語がサーバー上のファイルシステムまで届かない。

というかPythonではUTF-8の日本語で指定しているけど、ファイルシステム内での文字コードに合わせられないみたいな感じ。
厳密なところはわからないけど、色々調べながら実験して得られた体感。

これは、逆にos.listdir()でファイルリストを取得した場合も、日本語のファイル名をデコードできずにprint()することができなかった、ということからもそう思った。

結局、Pythonの中とファイルシステム内での文字コードの変換ができないとどうにもならないという結論になりかけた。
ちなみにUnicodeにしてみてもダメだった。

ということで一度は諦めたところで、os.fsencode()というのを見つけた。
ファイルシステムの文字コードからエンコードしてくれるらしい。

ということで、os.listdir()で取得したファイル名をos.fsencode()して、それをUTF-8にデコードしてあげると、Pythonで読める日本語になった。

これと、退避するファイル名のリストを突き合わせれば、退避するファイルかどうか判別できるようになる。

listdir()で取得したファイル名のutf8_lはPythonが判別できる(UTF-8)もので、lはファイルシステムが判別できるファイル名。
なので、比較(とprint)にはutf8_lを使って、shutil.move()に渡すのはlになる。

os.fsencode()の逆でos.fsdecode()というのもあるのだが、これを使えばPythonからファイル名の指定ができるんじゃないか?とも思って試したけど、どうにもうまくいかない。
出来るのかもしれないけど、自分が思いついて試したやり方ではうまくいかなかかった。

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