C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列の検索と置換) |
(→文字列比較) |
||
699行: | 699行: | ||
<br /> | <br /> | ||
という具合の動作であります。collの特徴的なのは辞書順と呼んでいる比較の概念だと思います。ASCIIコードでは大文字と小文字とでは、小文字の方が大きい文字コード番号が付与されていますが、wcs**coll系の比較をする関数では、小文字の方が値が小さいものとして判定してくれます。漢字の範囲になるとロケールで指定したcp932の文字コード順で比較してくれます。阿という文字と哀という文字はUnicode(UTF16)では阿-0x963F 哀-0x54C0 表-0x8868であり、Shift_JISのcp932では阿-0x88A2 哀-0x88A3 表-0x955Cと定義されていますから、阿<nowiki><</nowiki>哀<nowiki><</nowiki>表 のように比較をしてくれます。coll系の関数を使わない場合は 哀<nowiki><</nowiki>表<nowiki><</nowiki>阿のように比較されます。この阿や哀や表という名前のファイル名のテキストをWindowsのエクスプローラで昇順表示すると、この順番になることも確認できます。Shift_JISコード順でソートされてるんだなぁと確認が出来ると思います。Cp932の半角記号あたりの辞書順ってのは、どうなってるんでしょうね。これもまた今度しらべてみたいと思います。ファイル名に使えない文字あたりはどんな順番なんだろうか? | という具合の動作であります。collの特徴的なのは辞書順と呼んでいる比較の概念だと思います。ASCIIコードでは大文字と小文字とでは、小文字の方が大きい文字コード番号が付与されていますが、wcs**coll系の比較をする関数では、小文字の方が値が小さいものとして判定してくれます。漢字の範囲になるとロケールで指定したcp932の文字コード順で比較してくれます。阿という文字と哀という文字はUnicode(UTF16)では阿-0x963F 哀-0x54C0 表-0x8868であり、Shift_JISのcp932では阿-0x88A2 哀-0x88A3 表-0x955Cと定義されていますから、阿<nowiki><</nowiki>哀<nowiki><</nowiki>表 のように比較をしてくれます。coll系の関数を使わない場合は 哀<nowiki><</nowiki>表<nowiki><</nowiki>阿のように比較されます。この阿や哀や表という名前のファイル名のテキストをWindowsのエクスプローラで昇順表示すると、この順番になることも確認できます。Shift_JISコード順でソートされてるんだなぁと確認が出来ると思います。Cp932の半角記号あたりの辞書順ってのは、どうなってるんでしょうね。これもまた今度しらべてみたいと思います。ファイル名に使えない文字あたりはどんな順番なんだろうか? | ||
+ | |||
+ | |||
+ | coll系の比較の中身を見るための関数としては、strxfrm関数がある。これがロケール設定にしたがった照合順序文字列を生成してくれる。これは文字列ではあるが、書き出すことは出来ない照合のための文字コードだと考えればよい。中身をみたければstrxfrmで変換してバイトコードを確認することができるが、ロケール設定によってはなぜこんな変換になるんだ?というような不思議な変換がなされる。とくにen-US.utf8とかになると発音記号のアクセントや、特殊記号を別の辞書順と管理するため、1つの文字列が3つに分割され、1文字でもトークンとなるバイトコードが2つと文字列、アクセント、大文字小文字で3つのバイトコードで5バイトになる。更に特殊記号がひとつでも現れる文字列なら4つに分割され、特殊記号の使われる位置情報まで生成される。このような照合順序規則がロケールごとに存在する。coll系の比較関数はとんでもなく複雑な処理を行う比較関数なのだ。それゆえ通常のcmp系の関数と比べても、処理時間がかかる。localeごとの照合順序について理解しているならば、strxfrmで返還後のコードを使って、strcoll関数のような比較処理を高速化することも可能となる。ロケールによる処理も含めた関数の利用が必要になるケースもあるかもしれないが、ロケールの特徴を理解して、使うのも大事だし、使いどころが肝心となる。 | ||
'''★豆知識''' | '''★豆知識''' |