文字コード/Windows/Normalization
パス名に含まれる全角アルファベットの大文字/小文字
2ch プログラム板:Win32API質問箱 Build39(にくちゃんねる過去ログ)の 522〜537 あたり。
要約:
Win98 はファイル名に含まれる全角アルファベットの大文字/小文字を区別する。
しかし Win2000(以上)では区別しない。
(Me だとどうなるんすかね。Win98 と同じか?)
522 名前: デフォルトの名無しさん 2006/01/18(水) 18:40:53 Windowsって、ファイル名の大文字と小文字、区別しないんだな。 初めて知ったよ。 ていうかさ、ちょっとしたバックアップツール(差分コピー付)を 作ってたのよ。 バックアップ先に同名ファイルがあったら、退避するようにして。 で、まあ、当然日本語ファイル名は考慮するから、 コピー先に同名のファイルが存在しているかは、_mbsicmp()とかにするよな。 最初はこれ(_mbsicmp)が全角の"A"と"a"を同一視すると困ると思って試してみたけど どうやらちゃんと区別してるっぽい(bcc55)。 で、動作確認のために、 "A.txt" を "a.txt" が存在するディレクトリにコピーしようとすると、 CopyFile()が失敗。 まさかと思ってエクスプローラでも確認したら ちゃんと上書き確認が出やがる。 もしかして、Unicode版のAPIと_wcscmp()を使えば大丈夫か、と思って _wcscmpの動作を調べたら、 "A"と"a"は区別するくせに、"a"と"a"を同一視しやがる。 使えねー。 結局、自分で「同一ファイル名か確認する」コードを書くのが良いのかね? 部分比較(strncmp)もしたいし オリジナルのファイル名は尊重したいから、全部小文字に直すのは嫌だし。 比較のときだけ小文字に直す手もあるけれど。 528 名前: デフォルトの名無しさん 2006/01/18(水) 20:27:09 >>525 ::CompareString()をNORM_IGNOREKANATYPEとNORM_IGNOREWIDTHで 使うとか。 529 名前: 528 2006/01/18(水) 20:28:09 この場合NORM_IGNORECASEか… 530 名前: デフォルトの名無しさん 2006/01/18(水) 20:30:20 "A.txt" と "a.txt" って、Win9xでは区別される。 Win2Kからは区別されなくなったんだよな。NT4はどうだったかな? 531 名前: 522 2006/01/18(水) 20:57:02 おー、ありがとう。 >>528-529の方法(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE)で出来るっぽい。 と思ったら、>>530ですか。。。 532 名前: 522 2006/01/18(水) 21:01:38 区別する、しないはOSかな?それともFSかな? もしOSだとしたら、9xで"A.txt"と"a.txt"の両方を(FATに)作って そのディスクを2Kで読んだらどうなるんだろう? とりあえず、適当にFATの領域を作って、 「2K+FAT」の環境での動作から確認してみよう。 533 名前: デフォルトの名無しさん 2006/01/18(水) 21:06:08 XP上からFAT32に"A.txt"と"a.txt"はむりですた。 534 名前: デフォルトの名無しさん 2006/01/18(水) 21:18:52 >>530 これ、初めて知った。(2K/XPでも全角a/Aは区別されると思ってた。) で、実験君。 98で"A.txt" と "a.txt"をFAT32に作成し、このHDDをXPに接続。 DIRすると"A.txt" と "a.txt"の両方が見えるが、エディタで"a.txt"を開こうと すると実際に開かれるのは"A.txt"。 "A.txt"を削除すると、"a.txt"が開けるようになる。 既に納品済みのもので、これでトラブりそうなのがある・・・・・ 535 名前: 522 2006/01/18(水) 21:31:35 おー、みんな実験ありがとう。 区別する/しないはOSの動作で、 FAT上に両方あると、NT系では一覧では見えるけど開けないってことか。 っていうか、やっぱ知らなかった人、俺だけじゃないよね。 俺も別扱いするものだとばかり思っていたから。 >>530の、9xでは区別しなかったって聞いて、 そう思い込んでいた理由も納得した。 537 名前: デフォルトの名無しさん 2006/01/18(水) 23:30:58 "A.txt"と、"A.txt"は区別されるようだな。
等幅フォントじゃないと "A"(全角)と "A"(半角)の区別がつかないヨ…。
実際に問題が出そうなのはやはり 534 的なケースかと思われます。
というか、A.txt(全角大文字A)と a.txt(全角小文字a)が同一フォルダにあって、Win2K/XP で A.txt(全角大文字)を削除した場合、実際に消されるのはどっちになるのだろう。
たぶんディレクトリエントリの最初にあるほうだと思うけど。