Unicodeで“ぱ”という文字を表すには「ぱ」 (U+3701)と表す方法だけでなく「は」 (U+306F)+「゜」 (U+309A)の組み合わせで表す方法の2種類があります。後者のようなものを結合文字列と呼ぶようです。前者の1字になっているものは、合成済み文字や分解可能文字などと呼べばよいようです。

ここでは片仮名を例にしましたが、どちらかというとアルファベットに対するものが多いです。例えばcaféのéはeと上の点`(グレイヴ・アクセントと言うらしいです)からなっています。ローマ字でも長音を表すのに、TōkyōやÔsakaと表記することがあります。この種のものは多数あり(ダイアクリティカルマーク – Wikipeida)、全部に対応する文字を用意していたらきりがありません。そこで主なものは合成済みとして用意するが、その他は結合文字列として扱うことになったようです。

その際、合成済み文字と結合文字列の両方で表せるものが、例えば文字列検索などで両者が別物として扱われては不便です。そのためそういうときには、文字列全体をどちらかに揃える処理を施せばよいわけです。そのような操作をUnicodeでは「正規化」と呼び、4種類あります。ただし正規化では合成済み文字・結合文字列以外にも変換される場合があるようです。


というのが今のところ自分の理解です。詳しい方はほかに沢山いらっしゃるので細かいことは各自調べてみてください。

ここからが本題です。

.NET Frmaeworkでは、この正規化を行うメソッドがSystem.String.Normalizeとして用意されています。さてWin32 APIではどうだろうと調べてみるとありました、そのまんまNormalizeStringという関数が。

問題はそれがどのWindowsから使えるかということです。聞いたことのない関数なので、Windows 95辺りは確実に駄目だろうなと思いつつ下へスクロールしていきます。

Windows NT/2000/XP/Vista: Included in Windows Vista and later.
Windows 95/98/Me: Unsupported.
Redistributable: Requires “Microsoft Internationalized Domain Name (IDN) Mitigation APIs” on Windows XP (SP2 or later), Windows Server 2003 (SP1 or later).

「基本Windows Vista以上だが、Windows XP SP2以上とWindows Server 2003 SP1以上ではIDNを再配布すれば使える」ということでした。予想よりも悪いです。せめてWindows 2000辺りから使えるかと思っていたのですが。

となると自前で実装するか外部のライブラリに頼るかことになります。いずれにしても自分がやるとしたら後回しするのは確実で、ABがUnicodeをUnicodeとして使えるようになる時が一歩遠のきました。

本当、Unicodeは考えなければならないことが多いです。Unicodeが特別多いというわけではありませんが、Shift_JISの円記号問題が小さく見えます。

スポンサード リンク

この記事のカテゴリ