文字コード/Windows/Normalization

文字コード/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(全角大文字)を削除した場合、実際に消されるのはどっちになるのだろう。 たぶんディレクトリエントリの最初にあるほうだと思うけど。