さて、下の画面はエクスプローラでファイルを2つ表示させているのだが、この並び順は正しいだろうか?
答えは、もちろん正しい。詳細表示、名前による昇順の並び換えだ。ファイル名の長さが同じなので、「1.txt」が先に来て、「a.txt」が次に来る。名前で並び替える場合、「辞書順」が用いられる。辞書順とは、要するに文字コード順だ。英字だけの場合、ASCIIコードと呼ばれる文字体系を考慮すればいいが、ASCIIコードでは「1」は「a」より小さいことになっている。なので、この並び方は正しいのである。
これをよく理解してもらって、たとえば上の2つのファイルの名前を、それぞれ「01.txt」「0a.txt」に変えてみたらどうなるか?頭に同じ「0」が付いただけで長さも変わらないから、並び順は変わらないのでは?と思ったあなたは正しいが、どうやらVistaはそうは思ってくれないらしい。実際にファイル名を変えてみよう。
あらら、並び順が変わってしまった。並び順を降順にひっくり返せば、期待するものになるが、それだと変だろう。なぜこのようになるのかはわからない。Unicodeでも、「1」だの「a」だのはASCIIと変わりない。ちなみに、「^.txt」というファイルを作ると、こんな感じになる。
おさらいで、文字コードは、0=48、a=97、^=94だ。これだと、順番は「0.txt」「a.txt」「^.txt」となるはずだが、実際はこうならない。多分、エクスプローラの並び換えには独自の方法があるようなので、ちょっと調べてみた。
これは、Windows XPでも同じのようだ。Windows XP以降では、ファイル名で並び替えるときに、ファイル名の中の数字を「数値」として見なすらしい。また、数値と文字では、数値が小さいと見なされるらしい。つまり、「1.txt」と「a.txt」では、
- 数値の1
- 数値なし(つまり文字)
で、「1.txt」が「a.txt」より小さいと見なされる。だが、「01.txt」と「0a.txt」では、
- 数値の1
- 数値の0+「a」
ということになって、この場合は「0a.txt」が「01.txt」より小さいということになる。何とも不思議な仕様だが、「^.txt」が「0.txt」より小さいことになったのは、記号は数値より小さいと見なされるらしい。この仕様だと、たとえばファイル名を16進数にしている人(そういう人は一般の人にはいないだろうが)は困るだろう。私も、そういったファイル名の命名法で大量に送りつけられたファイルの一覧を見て、変だと思ったのだ。
この仕様はWindows XPからで、Windows 2000では単純に文字コードで比較していたらしい。ちなみに比較方法は変えられるようで、MSはこんなページを用意している。
Vistaで有効かどうかは未確認。まぁ、理屈がわかってしまえばどうでもいい話である、私にとっては。
コメント