いつもダラダラ長くなるので最初に話を箇条書きにしよう。

 *全角カナはァアィイゥウェエォオカキク・・・というコード順になっている
 *半角カナはヲァィゥェォャュョッーアイウエオカキク・・・というコード順になっている
 *半角カナはソート順がひどい。全角カナは完璧ではないが、まあマシである
 *と、思っていたが、この件MacとWindowsで違っていて、Windowsはちょっと気を利かせて全角カナ風にソートする
 *これは日本の半角カナだけの配慮であって、分音記号つきのラテン・アルファベットは機械的にコード順にソートされる
 *だからヨーロッパの辞書は、ソート順を調整するためによみがな的なものを導入していると思われる

という、これだけのことをものすごく雑談まじりでダラダラ書くから読む人は覚悟するが良かろう。
Bar Code Sorter LMPP

*全角カナはァアィイゥウェエォオカキク・・・というコード順になっている

カナにはいわゆる全角カナと半角カナがある。
全角カナは「ゼンカクカナ」のような文字だ。
半角カナは「ハンカクカナ」のような文字だ。
WindowsのMSゴシックや、MacのOsakaのようないわゆる等幅フォントで見ると、半角カナの横幅が全角カナの半分に見える。
これは昔、コンピューターの出力装置がキャラクターディスプレイやラインプリンターのような文字単位で出力するものだった当時、表組みなどで便利だった。

14

しかし、字によって太さを変えるプロポーショナルフォントを使うと、一気にガタガタっと崩れてしまう。

26

そもそも字の大きさなんかワープロソフトでいくらでも変えられる。
漢字でも半角にできるし、半角カナでも倍角にできる。
だから、半角カナ、全角カナという言い方は不正確である。
と、いうことを、知ってて、知りつつ、本稿では便宜じょう半角カナ、全角カナと呼ぶことにする。

いわゆる半角カナはJIS X 0201由来の「アイウエオ」というカナだ。
Shift_JISで2バイトになるから、1バイトカナとも言われるが、UTF-8では3バイトになるからこれも不正確だ。

いわゆる全角カナはJIS X 0208由来の「アイウエオ」というカナだ。
Shift_JISで2バイトになるから、2バイトカナとも言われるが、これもUTF-8では3バイトになるからこれも不正確だ。

8ビットを1バイトっていう言い方も問題があって、1バイトが8ビットとは限らないから正しくは1オクテットと呼ぶべきだ。
いちいちうるせえよ。
ホントそう思う。
こういう陥穽があるから、なかなか話が先に進まないのである。

さて、全角カナであるが、アイウエオカキクケコ・・・という順番にならない。
ァィゥェォのような小さいカナ、「フイル」とか「フレオフィッシュ」のような言葉で使う小さい字を小書きカナというが、これが小書きでない(なんて言うんだろう。大書き?)アイウエオの間に挟まる。
ァアィイゥウェエォオカキクケコ・・・という順番になる。

The Unicode Standard, Version 7.0 - U30A0.pdf(PDF)

これは、ソート(並べ替え)の順番を考慮しているのだ。

以下の5つの言葉を並べ替えるとする。
 不安
 ファイル
 フィンランド
 不入り
 フィットネス
単純に文字コード順にソートすると、こうなる。
[blog]$ sort kanji.txt
 ファイル
 フィットネス
 フィンランド
 不入り
 不安
カタカナが上に寄ってしまうし、漢字の音読み/訓読みも正しくソート順に反映されない。

(このソートはUnicode順である。Unicodeで「安」がU+5B89、「入」がU+5165だから、「安」が後になってしまう。
 JIS順だと「安」が30-42、「入」が46-7Eだから、「安」の方が先になる。
 Unihan data for U+5B89
 Unihan data for U+5165
 カナは日本しか使わないのでJIS順とUnicode順が一緒になる。
 漢字のUnicodeは日本、中国、台湾、韓国、あとベトナムのチュノムをガッチャンコして、似た字は整理して並べ替えているので、JIS順と全然変わる。
 このようなUnicodeの漢字の整理をHan Unificationという。)

ということで、漢字カナ交じり言葉のソートの前に、「よみがな」をつけることになる。
ここではカンタンのため、言葉の「前」にカタカナでよみがなを振る。
 フアン    不安
 ファイル ファイル
 フィンランド フィンランド
 フイリ    不入り
 フィットネス フィットネス
これでソートする。
[blog]$ sort yomigana.txt
 ファイル ファイル
 フアン    不安
 フィットネス フィットネス
 フィンランド フィンランド
 フイリ    不入り
まあまあいい感じだ。
完璧ではない。
フィンランドがフイリの前に来ているのが間違っている。
ィがイよりも小さいので、フィとフイの時点で勝負がついているので、こうなる。
でもまあ、まあまあいい感じである。

*半角カナはヲァィゥェォャュョッーアイウエオカキク・・・というコード順になっている

いっぽう、半角カナはコード順が「ヲァィゥェォャュョッーアイウエオカキク・・・」という順番になっている。

The Unicode Standard, Version 7.0 - UFF00.pdf(PDF)

なんでだろ。
JIS X 0201の方が、JIS X 0208よりも先に(むかし)出来たから、考えが足りなかったのであろう。
ていうか、JIS X 0201の反省のもとに、JIS X 0208ではコード順を考えなおしたということだろう。
じゃあJIS X 0201の方使うのやめちゃえばいいのにね。
現実には半角カナは、2014年げんざいにおいても新生銀行はじめ大企業が愛用しているので、なくなりそうにない。

*半角カナはソート順がひどい。全角カナは完璧ではないが、まあマシである

それはともかく、上の5行のよみがなを半角カナでふったとしよう。
 フアン    不安
 ファイル    ファイル
 フィンランド  フィンランド
 フイリ    不入り
 フィットネス   フィットネス

ソートしてみる。
[blog]$ sort hankaku.txt
 ファイル    ファイル
 フィットネス   フィットネス
 フィンランド  フィンランド
 フアン    不安
 フイリ    不入り
見事に順番が狂ってしまう。

これ、ァの方がアよりも、ィの方がイよりも小さいので、ファ vs. フア、フィ vs. フイの時点で勝負がついてしまって、小書き文字が上に寄ってしまうのだ。
だから半角カナのソート順は気を付けた方がいい。

*と、思っていたが、この件MacとWindowsで違っていて、Windowsはちょっと気を利かせて全角カナ風にソートする

この話をちょっとした小話として、執筆中の本に挿入しようとしたのだが、Windowsだと結果が違うことが分かった。

20141016sort
C:\Users\cf\Dropbox\blog>sort yomigana_sjis.txt
 ファイル ファイル
 フアン    不安
 フィットネス フィットネス
 フイリ    不入り
 フィンランド フィンランド

C:\Users\cf\Dropbox\blog>sort hankaku_sjis.txt
 ファイル    ファイル
 フアン    不安
 フィットネス   フィットネス
 フイリ    不入り
 フィンランド  フィンランド
UTF-8をWindowsのコマンドプロンプトに出すと「縺ッ繧ン繝ゲ・・・」のように文字化けするので、Shift_JISに変換してから実験しているが、見事に半角カナも全角カナも同じ順番に、いい感じにソートしている。
っていうか「フイリ」が正しく「フィットネス」と「フィンランド」の間に入っていて、超いい感じである。
完璧に辞書順だ。
つまり、何らかの読み順を意識していて、日本語的に正しくソートしてくれている。
原理はよく分からない。
誰か教えて下さい。

でもこれでいいのだろうか。
機械的にコード順でソートする前提の、過去の資産のプログラムはちゃんと動くのだろうか。

*これは日本の半角カナだけの配慮であって、分音記号つきのラテン・アルファベットは機械的にコード順にソートされる

*だからヨーロッパの辞書は、ソート順を調整するためによみがな的なものを導入していると思われる

ちなみに、ヨーロッパで使われるISO-8859-1に入っているラテン・アルファベットは、まず英語のABCがASCIIと同じ順番に入っていて、À Á Â Ã Ä・・・のようなアクセント記号つきの文字が後半にまとめて出てくる。

ISO/IEC 8859-1 - Wikipedia

ではフランス語の単語を並べ替えたらどうなるのであろうか。
ぼくはこのことを調べるだけのために、図書館に行ってフランス語の辞書を引いた。
(フランス語の辞書ぐらい家にないのがどうかって話だが)
以下の4単語について調べよう。
abréger   省略する(動詞)
abreuver   水を飲ませる(動詞)
abreuvoir  水飲み場(名詞)
abréviation 省略(名詞)
辞書はこの順に並ぶ。
アクサングラーブがないeと、あるéが隣り合って並ぶと考えれば、それに続く字がgであるabrégerが一番上に来る。
abreuverとabreuvoirの勝負は、abreuvまでが一緒で、その後がe対oなのでやはりabreuverが上に来る。
最後はéのあとがvであるabréviationが来る。
この考え方で合っている。

ところが、Windowsでソートすると順番が変わる。
C:\Users\cf\Dropbox\blog>sort french.txt
abreuver
abreuvoir
abréger
abréviation
アクサングラーヴつきのéがコード順で後になるので、下に寄る。
つまり、コード順に機械的にソートしている。

ちなみにこれは、Macでも同じ挙動になる。
[blog]$ cat french_u8.txt
abréger
abreuver
abreuvoir
abréviation
[blog]$ sort french_u8.txt
abreuver
abreuvoir
abréger
abréviation
だから、ヨーロッパの辞書編纂者は、各エントリに、文字上の単語表記の他に、アクセント記号を無視するよみがな的なフィールドを持っていて、それでソートしているとおぼしい。



まとめると、こうなる。
      ISO-8859-1   全角カナ    半角カナ
 Windows  機械的に並べる 読み順に並べる 読み順に並べる
 Mac    機械的に並べる 機械的に並べる 機械的に並べる
Windowsのカナのソート順がよく分からない。
なれると便利なのかなーという気もするが、コード順を意識しているとアレッとなりそうである。
とりあえず注意が必要だ。