Chienomi

Windows PerlでUnicodeなファイル名を使ってはまる

プログラミング

  • TOP
  • Old Archives
  • Windows PerlでUnicodeなファイル名を使ってはまる

業務でPerlでプログラミングしていたのだが、 Unicodeなファイル名で出力していたら文字化けする、という症状が報告された。

ミニマムのコードとしては以下の通り

use utf8;

open(FH, ">", "てすとふぁいる");
FH->print("テスト出力");
close(FH);

これはLinuxでは問題なく動作するし、それについては実際に動作させて確認もしてある。 ところがWindowsではこれが文字化けする。

まぁ、NTFSはUTF-16LEだもんね。 というわけで対応してみる。

use utf8;
use encode;

open(FH, ">", encode("UTF-16LE", "てすとふぁいる");
FH->print("テスト出力");
close(FH);

ところがこれでもだめである。

もちろん、次のようにすれば動作するのは知っている。

use utf8;
use encode;

open(FH, ">", encode("cp932", "てすとふぁいる");
FH->print("テスト出力");
close(FH);

おそらくWindowsがShift-JISをシステムエンコーディングとして使っていて、FATの日本語ファイルにもShift-JISを使っていたこととの互換性のためにシステムが何かをしているのだろう。 だが、その何かの結果うまくいかなくなってしまう。 日本語ファイルならShift-JISで書くという手もあるが、今回の場合お客様の要望としてはファイル名にはハングルを使う。しかしシステムは日本語Windowsである。

さて困った。

Win32::Unicodeという手もあるようだが、これがUnicodeでかけるのかは結構疑問だ。 さらに言えば、今回の場合かなりの数のファイルを書くため、速度低下が無視できない。

ちなみに、Ruby (RubyInstaller)だと

File.open("てすとふぁいる", "w") {|f| f.puts "テスト出力" }

ちゃんと動作したりする。

テストしたところ、Active Perlでも、Strawberry Perlでも問題は同じ。 しかしCygwin Perlだと起きない。 Cygwinを使うというのは初心者にとってちょっとハードルが高いので避けたい部分ではあるのだが…

なお、RubyはMinGWを使っているから大丈夫なのかもしれない。

お仕事ではPerlも使えます。 今じゃ使える人も少ないので貴重なのではないかと思う。 ご依頼、お待ちしてます!!