I know I believe in nothing but it is my sweet nothing.:2015年06月21日分

2015/06/21(Sun)

[Windows][I18N] Windows 10 の国際化についての違和感 (その3)

前回は Windows 7 のスタートメニューの並びは

並べているというお話でした、今回はこの「文字列照合順序」とはどのような処理なのかについてざっくりと触れてみます。

@文字列照合順序

日本語における文字列照合順序が、実際にどのような処理を行うかは

などとして工業規格化されておりますので、まずはそれを読みましょう。

…でもですね、内容について大変に複雑かつ難解です。こ↑こ↓で全てをご紹介することは到底無理なので、いくつかポイント絞って解説していきます。

@基底文字(Base Character)への丸め

基底文字とは、元々の用語としては 基本ラテン文字の 26 字を指します。

英語ではこの基本字のみしか使いませんが、その他(主にヨーロッパとその植民地)の言語ではこの基本字に ダイアクリティカルマークを組み合わせた文字を使用します。

ダイアクリティカルマークの有名どころだと

名称 基本字 + ダイアクリティカルマーク 合成済 Unicode(UCS4) Latin-1(ISO8859-1) 備考
ダイエリシス(ウムラウト) a + U+0061 + U+0308 / U+00E4 0xE4 ドイツ語など
グレイヴアクセント a + U+0061 + U+0300 / U+00E0 0xE0 フランス語など
アキュートアクセント a + U+0061 + U+0301 / U+00E1 0xE1 スペイン語、イタリア語など
サーカムフレックスアクセント a + U+0061 + U+0302 / U+00E2 0xE2 フランス語、ベトナム語など

などは目にしたことがあるかと思います。これらの文字は「基本ラテン文字 + ダイアクリティカルマーク」のリガチャで表現することも可能ですが、たいていの符号化文字集合においては合成済文字として収録されていますやね。

上の例で挙げた文字の基底はすべて「a」です、コードポイント的には a とは離れた場所にあることが多いのですが、文字列照合順序では同じ順序として扱うわけです。

前回作成した sortstr.c で試してみましょう。

ダイアクリティカルマーク付の a たちが、コードポイントでは前になるはずの o より前にソートされていることがお判りいただけますでしょうか。

これはつまり

  • 合成済文字をバラして分解して
  • 「丸め」して順序を比較した

結果、この並び順になったわけです。

ここまで読んで

「丸め」ってつまりは「Unicode正規化」のことか!

とヘウレーカして全裸で路上に飛び出して股間の愛・昆布をたなびかせた人、残念ですがそれは間違いです。 Unicode 文字列照合ジュンジュワー において Unicode 性器化 は最も重要なテクニックですが、イコールではありません。

一例をあげると、Unicode正規化では

  • (アッシュ) … ae と等価
  • (エスツェット) … ss と等価
  • (ストローク付きオー) … o と等価

などの文字については合成文字ではないとして分解はしないんですよな、詳しいことは

を見て下さい。

しかーし文字列照合順序では、こいつらはきっちり等価として扱うんですね、いやはや。

@ラテン語圏においてはこの基本ラテン文字26文字でインデックス化 / グループ化される

えー Windows 10 のスタートメニューなんですが「全てのプログラム」にメニューを追加する方法がよくわからんので(できないっぽい)、しゃーないから代わりとして「People」というアドレス帳アプリに、ダイアクリティカルマーク付の文字を登録して、どういうインデックスが作られるか、確認してみましょ。

ウムラウトな a は「A」に、エスツェットは「S」に、インデックス化 / グループ化されています。

@次回

今回はラテン文字における基底文字を説明しましたが、次回はいよいよ日本語です。