- ベストアンサー
ファイル名が違っていても
同じファイルを指してしまいます。 半角英字大文字と半角英字小文字の区別をしないというマイクロソフトの悪い習慣がそうさせてます。 そうなると2バイト文字と1バイト文字とが混じったファイルが同じファイルを指すかどうかを知るためにはやっかいなことになります。 2つの文字列が半角英字だけ大文字と小文字を区別しないとして等しいかどうかを判定する関数はありますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Windows限定なら、CompareString()でNORM_IGNORECASEを指定するとできます。また、PathMakePretty()でパスを小文字に変換してから比較しても良いと思います。
その他の回答 (1)
- MovingWalk
- ベストアンサー率43% (2233/5098)
>半角英字大文字と半角英字小文字の区別をしないという 基本的には全て大文字として処理しているようです。 >2つの文字列が半角英字だけ大文字と小文字を区別しないとして >等しいかどうかを判定する関数はありますか? そういう関数は半角のみでもないと思います。 2つの文字列をともに大文字の文字列にして比較することになります。 全角と半角が混在しているときは、文字列を1文字ずつチェックして、 半角小文字なら半角大文字に変換し、SHIFT-JISの1バイト目であれば 次の1バイトをスキップして処理するなどを考慮して、文字列の半角小文字を 半角大文字に変換する関数を作る必要があると思います。 SHIFT-JISの1バイト目かどうかは、そのコードが 0x81~0x9f、0xe0~0xfc かどうかで判定すればいいと思います。 (この範囲ならSHIFT-JISの1バイト目) http://www.kanzaki.com/docs/jcode.html#sjis
補足
ありがとうございます。 そういう関数は半角のみでもないと思います。: PathMakePretty 大文字のパスを小文字に変換 は半角だけだと動作しますが混じると駄目です。 StrCmpNI 大文字・小文字を区別しない、文字数を指定した文字列比較 はコンパイルはできるのですが実行時エラーになります。 それに実行できても半角だけの時の関数でしょうから駄目だと思います。 足かせをしてのプログラミングは大変ですからルーチンワークですから関数を用意してほしいものですね 。
お礼
void main(void) { char s0[] = "C:\\BOK課す.BMK"; char s1[] = "c:\\bok課す.BMK"; if(CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,s0,strlen(s0),s1,strlen(s1))==CSTR_EQUAL) printf("ok"); else printf("out"); } でs0とs1をいろいろ変えてやるとうまくいくことが分かりました。 しかし1に書いたようにPathMakePretty()は全角が混じると全く変換してくれません。 ありがとうございました。