久々に素のcygwin1.dllに戻して、straceかけてみて納得。
# for n in 0 1 2 3; do strace -o ~/find.$n.trace find t$n -print; done
原因はnormalize_posix_path()でコードページを無視して
無条件に0x5c(\)を0x2f(/)に変換しているためです。
このためにSJIS第二バイトに0x5cを含む文字('ソ'など)が
破壊され、"ABCソフト"が"ABC(0x83)/フト"となってしまい、
エラーが発生します。
# エラーメッセージが変な原因は忘れました。
なお、t3では、opendir()でディレクトリの中身を検索す
るために渡されたパスに'\*'を付加してFindFirstFileA()を
呼んでいるところで、パス名の末尾の文字が0x5cだった場合
には、'*'しかつけていないことも影響します。
問題はcygwin1.dllの内部でFindFirstFileA()のようにANSI
コードページをパス名として受け取るWin32APIを使っている
のに、ANSIコードページを無視して文字列処理を行っている
あたりにあるような気がします。
# FindFirstFileW()のようなワイドキャラクタ(Windowsの実装
# では実体はUnicode)を受け取るAPIを使うか、藤枝さんのi18n
# 拡張のようにISO Cのワイドキャラクタ関連を実装するしか
# ないと思いますが、どちらにしても範囲が大きい...
このあたりの問題は、文書としてまとまったものはないと
思います。
# 皆さん問題を避けて使っているみたいで。
|