numaの日記: Windows・Perl・UTF-16三題噺 2
日記 by
numa
「WindowsでPerlを使ってUnicode処理(1)~(7)」という題名の雑文を公開いたしました。興味がおありでしたら、ご笑覧いただければと存じます。
といっても、「UTF-16は面倒くさい」・「Windowsは奇奇怪怪だ」としか書いていないようなものでありまして、前者は最初から想像していたとおり、後者は、ハードリンクがファイル属性を共有してなかったり、パイプがシークできたりするOSに、いまさら何を期待していたのか、という話ではございますが。
読みました (スコア:3)
http://blog.livedoor.jp/numa2666/archives/52344853.html [livedoor.jp]
> Mac OSはNFD、WindowsはNFC。
Mac OSのファイル名は互換漢字を分解しない独自の正規化形式です。Windowsのファイル名に正規化の概念はありません。たまたま合成済み文字で入力されることが多くてそれを素通ししているだけです。
この文脈でのNFD/NFCは「漢字イン」とか「サニタイズ」とか「DNS浸透」並みのNGワードなのでご注意。Unicode::NormalizeではなくEncode::UTF8Macを使いましょう。
http://blog.livedoor.jp/numa2666/archives/52344855.html [livedoor.jp]
世の中にはJPerlをこきおろしつつ(しかも「国際化に対応できない」とかなんとかもっともらしい理屈をつけて)、openに渡すファイル名の変換はcp932決め打ちとかいうちょっと意味のわからない「モダンPerl流」の紹介文書があふれているので、Encode::Localeが出てきて安心しました。
まあANSI CPにない文字を含むファイル名を扱うならWin32::UnicodeかWin32::LongPathを使うかWin32::APIでゴリゴリやるしかないんですが。
http://blog.livedoor.jp/numa2666/archives/52344856.html [livedoor.jp]
C++ならGetCommandLineWとCommanLineToArgvWでUnicodeのコマンドラインを直接取得できます。PerlモジュールではWin32::Unicode::NativeにUnicodeコマンドライン取得の機能があります。あるのはいいのですが、このモジュール他にも副作用がいろいろあるのが困ります。ほしいのはコマンドライン取得の機能だけなのに。なにかいい方法はないでしょうか(なぜか逆質問)。
Re:読みました (スコア:1)
コメントありがとうございます。ご指摘の件は訂正しておきました。その他については、もう少し調べてみます。
# 急にPVが増えて、びびっていたところです。