Collation / Collating Sequence

ソート順序のこと.[注 規格文書など公式な文書では“照合順序”と訳される場合が多いようですが,ぶっちゃけソート順序のことです.この文書では わかりやすさを優先して,ソート順序としておきます.]

日本語については長らく“機械まかせで期待通りにソートされる”なんて まったく期待できない状態だったため ほとんど意識されていませんが,アルファベットを使う欧米では電算化黎明期の1960年代には既にソート順を正しくする取り組みがはじまっていたようです(例えば COBOL 言語規格では 1963年制定の拡張 COBOL-61 規格で早くもソート順の話がでてきます[11][12]).日本人の技術者だと“英数字のソートなんて ASCII 順じゃないの?”くらいに思っていたりしますが,実際には そんなに簡単ではなかったりします.

大文字・小文字 混在問題

ソート順の典型的な議論は,例えば大文字・小文字の並び順です.例えば,文字列“abc”と“ABC”をソートすると,どの順に並ぶかご存知でしょうか.ASCII 順だから“ABC”(0x414243) → “abc”(0x616263)? 正解は下表のとおり…
LANG=en_US.UTF-8 LANG=C ※ASCII順
abc
ABC
ABC
abc

英語圏では“同じ文字の大文字・小文字は小文字を前に並べる”という習慣があるため,現代のコンピューターは abc → ABC の順に並べるようになっています.これは Linux でも Windows でも共通です.(※日本語環境の場合---例えば LANG=ja_JP.UTF-8の場合---も英文字は英語の規則にしたがうため LANG=en_US.UTF-8 の結果と同じになります.)

LANG=C を指定して単純な ASCII 順に並べることもできますが,現代的なコンピューターの場合,意識して変更しないかぎり,LANG=C にはなっていませんし,なにより,ASCII なんて知ったこっちゃない一般の人たちには文化的・伝統的な観点から,abc → ABC の順に並ぶべきだと考えていることは知っておく必要があるでしょう.

※各ロケールでのソートを試す場合は下記のコマンドを使ってください.
■ Linux の場合
$ LANG=en_US.UTF-8 sort *.txt
$ LANG=C sort *.txt

■ Windows の場合
> sort *.txt
> sort /L C *.txt

スペース区切り問題

単語がスペースで区切られるケースも よく問題になります.日本語にはスペース(空白文字)を使った分かち書きの習慣がないため,あまりピンとこないと思いますが,アルファベット文字圏では よく知られた問題です.例えば“John Stuart”と“Johnny Winter”をソートすると,どちらが先に並ぶでしょうか?

どちらも“John”までは一致しているので,その直後のスペースと“n”の扱いをどうするかポイントです.単純な ASCII 順では,スペースは 0x20,“a”は 0x61 ですので,John Stuart → Johnny Winter となります.コレで決まりだろって思ってるIT技術者の方は次の結果をみて驚くかもしれません.
LANG=en_US.UTF-8 LANG=C ※ASCII順
Johnny Winter
John Stuart
John Stuart
Johnny Winter

何がおこっているかというと,スペースを除去して JohnStuart と JohnnyWinter を比較し,5文字目の“S”と“n”を比べることで,Johnny Winter → John Stuart となっています.これは辞書などで熟語を並べるときの規則がそうなっているためです.手近な英和辞典等で,下記のような単語の並びを調べてみると納得していただけるでしょう.
LANG=en_US.UTF-8 ※辞書順 LANG=C ※ASCII順
ad-agent
ad banner
add-on
ad hoc
ad-lib
advertizement
ad banner
ad hoc
ad-agent
ad-lib
add-on
advertizement

[※注 この節の例は Windows 7 日本語環境の sort では正しく動作しないようです.John Stuart,Johnny Winter の例では,スペースが通常の文字とみなされます.また,上記の英単語 ad-agent 〜 advertizement の例では,完全な ASCII 順ではなくハイフンとスペースの順が逆転した状態になるけど,しかし,やっぱりハイフンもスペースも勘案しているような不思議な動作になります(sort と sort /L C の動作はちがっているので何かしているのは間違いないが期待通りではない状態).詳細は不明ですが,互換性を維持する目的で古い折衷案のような動作を生かしているのかもしれません.]

ウムラウト,アクサングラーブ,…

さらに面倒な問題として,ドイツ語のウムラウトやフランス語のアクセント記号(アクサン グラーブ)つき文字の問題があります.文化的・伝統的な順序で並べる点は ここまで説明した大文字・小文字問題やスペース・ハイフネーション除去と同じ扱いですが,ウムラウトやアクサン グラーブは Unicode では“組文字”として表現されますので,たいへんややこしい処理をしながらソートしなければならないのです… 正直,もうコレ以上は説明したくないです.

じゃぁ日本語ではどうなのよ?(・_・ )

ここまでの話を要約すると,少なくとも最近のOSは“文字コード順ではなく辞書順にソートしようと がんばっている”ということなのですが,それでは日本語についてはどうなんでしょう?

日本語の場合,アルファベット文字より さらに混乱していて,ひらがな,カタカナ,漢字,アルファベット(英字),アラビア数字など,さまざまな文字種が混合されて使われています.漢字については,音読み・訓読みなど,同じ文字に複数の読み方があり,文脈によって読み方がかわるというカオスっぷりです.いったい どうソートしているのでしょうか…

答えは簡単で“日本語でも やっぱり辞書順”にしようと がんばっています.日本語における辞書順がどうなっているのかは,一般の方は ほとんど意識したことがないと思いますが,日本語の辞書(国語辞典)があることからもわかるとおり,ちゃんと規則があります.国立国語研究所の五十音順の解説[6]や各出版社の解説(例えば学研の国語辞典の言葉の並び方[7])を読んでいただければ,ご納得いただけると思います.

実際の例を見てみましょう.
SJIS/EUC-JP ※辞書順
sort
C ※ASCII順
sort /L C
こだに
ごとう
こんの
こだに
こんの
ごとう

人名のソートを想定した例で,ここでは,“こだに(小谷)”,“ごとう(後藤)”,“こんの(今野)”の3つを並べ替えています.単純な文字コード順だと“こ”→“ご”の順になるため,“こだに→こんの→ごとう”になりますが,辞書順では濁音は清音にかえて評価する規則なので,“こたに→ことう→こんの”の順になります.“小谷さん”“後藤さん”のように,自分の苗字に濁音が含まれている人は学校の出席簿の並び順で,もしかしたら この規則に気づいてるかもしれませんね.

Links

[1] IBM: Collating sequence
[2] Microfocus: Character Sets and Collating Sequences
[3] Wikipedia: Collation
[4] Microsoft: You receive a "Selected Collating Sequence Not Supported" error message in Access 2000
[5] Microsoft: Access 2000 で、「選択された照合順序はサポートされていません」のエラーが表示されます。
[6] 国立国語研究所: よくある「ことば」の質問 - 五十音順
[7] 学研: 編集部に よくくる質問 - 国語辞典の言葉の並び方【国語】
[8] Wikipedia: 五十音順
[9] Wikipedia: 日本語文字列照合順番
[10] Microsoft: 日本語の並べ替え順序について
[11] Wikipedia.en: COBOL
[12] Wikipedia.jp: COBOL

はたいたかし
2014-08-26 ubuntu 14.04,Windows 7 の最新事情を反映.
2004-11-11 初稿.

Home > Dev > Locale > Collation