Unicode正規化 その1 (2009.7.29 改訂)

Unicodeのテキストをあつかう上で、「結合文字の並び」と「Unicode正規化」はどうしても避けることのできない問題です。ここではあまり深く掘り下げずに、ユーザの眼を通してこれを見ていこうと思います。

まずはじめに、Unicodeには「特殊な文字」があることを知っておきましょう。

Unicodeの特殊な文字

ポポ ここに2つの「ポ」があります。OS X のエディタ「テキストエディット」に表示された文字です。

まったく同じに見えますが、この2文字、実は全然違う文字です。左は普通の1文字ですが、右は「ホ」に「半濁音」がくっついた2文字のデータで構成されています。見た目が1文字として表示されるので、2つの「ポ」は違いがまったく分かりません。

そこで、違いを実感できるように簡単なソフトを作ってみました。

簡単なソフトをダウンロード

このソフトは、テキストエディットと違って「ホ」と「半濁音」を別々に選択することができます。さらに選択した文字のコードポイントが下に表示されるようになっています。ぜひ試して遊んでみてください。

左に「ポ」と手入力し、「NFD」ボタンを押すと、右に「ホ+半濁音」が表示されます。この「ポ」をマウスで触ってみましょう。「半濁音」だけをカットしてペーストしてみるのも面白いです。「1文字が2文字のデータで構成されている」とはどういうことなのか、実感できますよね。

次にもっと興味深い文字を見てみましょう。「Get Glyph …」ボタンの上に「01D6」とコードポイントを入力し、ボタンを押します。上にその文字が表示されます。小文字 u にアクセント記号が付いた文字ですね。「NFD」ボタンを押して変換してみます。なんと、2文字ではなく「3文字」で構成されていることが分かります。

さらに、「Get Glyph …」の上に「00FC 0304」と2つのコードポイントを入力し、ボタンを押してみます(半角スペースを間に入れてください)。上図とまったく同じ字形が表示されます。これは3文字ではなく「2文字」で構成されています。

つまり、この字形は
「01D6」
「00FC 0304」
「0075 0308 0304」
の3通りの方法で表示できてしまうんですね。

3通りの同じ字形 この3通りの文字を「テキストエディット」にコピー&ペーストしてみましょう。テキストエディットでは、どの文字も1文字として選択されます。さらに検索をしてみると、どの文字にもヒットします。3つが異なる文字であることをまったく判別することができませんし、判別する術もありません。もちろん、これはユーザへの配慮でそうなっているわけです。

さて、ここで専門用語を3つだけ覚えてください。

「結合」「結合文字の並び」「結合文字」

これまで見てきたように、Unicodeには「1文字を複数の文字で構成する」という特殊な方法が用意されています。この特殊な方法のことを、Unicodeでは単純に「結合 Combining」といっています。平易な言葉なのでつい読み流してしまうのですが、Unicodeの文脈では特殊な専門用語であることに注意してください。

そして「結合」によって1文字と見なされるようになった複数文字のことを、専門用語で「結合文字の並び Combining Character Sequence」といいます。

さらにそして、上の説明で登場した「半濁音」「アクセント記号」などのことを、専門用語で「結合文字 Combining Character」といいます。この文字は “結合文字の並び” のためだけに用意された特殊な文字なので、単独で使われることはありませんし、単独で使ってもいけません。

ちなみに、これは覚えなくても構いませんが、結合文字の並び「ホ+半濁音」の「ホ」の方は、結合文字ではなく「基底文字 Base Character」と呼びます。

Mac OS X は “結合文字の並び” だらけ

さて、Unicodeの特殊な文字である「結合文字の並び」がどういうものかを見てきましたが、もしかすると、皆さんはこう疑問に思っているかもしれませんね。

「特殊な文字のことは分かった。でも、特殊なんだから、普通に作るテキストデータにそんな文字なんか無いのでは?」

実は、OS X には “結合文字の並び” が普通にいたるところにあるのです。しかも、新しく簡単に作ることもできてしまいます。やってみましょう。

名称未設定フォルダ デスクトップに新規フォルダを作ります。なんと、このフォルダの名称にある「ダ」が “結合文字の並び” なのです。「ダ」を「簡単なソフト」へペーストしてみてください。2文字の “結合文字の並び” だと分かります。

OS X のフォルダ名やファイル名などのアイテム名は、手入力をした場合でも “結合文字の並び” にできる文字ならすべて “結合文字の並び” へ自動的に変換されます。ですから、アイテム名をテキストにコピー&ペーストするだけで、特殊な文字が普通に作るテキストデータに混ざってしまう可能性がきわめて高いのです。それに今では OS X だけでなく、Windows も Vista で “結合文字の並び” の表示に対応するようになりましたから、そこでも気づかずに混在してしまう可能性が高まったことも押さえておくべきでしょう。

補注
日本のユーザがUnicode正規化で混乱する原因のひとつに「日本訳語が定まっていない」という現状があります。その最たるものが、この2つです。

combining
  複数文字の組み合せで1文字を表現していること
composition
  複数文字で表現された1文字を単一コードの1文字にすること

実はこの2つ、意味がまったく異なるのですが、日本語訳では「結合」と「合成」、辞書的にはどちらでも当てはまってしまいます。ですから、上記で私が「結合」と記した「combining」を「合成」と言っている資料もあります。しかし、それではそうした資料に「composition」の首尾一貫した訳語があるのかというと、私が知る限り見た事がありません。

この2つの訳語を選定するには、他の語もあわせて考える必要があります。

combining
composition
decomposition = 分解
precomposed = 合成済み

最低限、この4つを区別できる訳語にする必要があります。下の2つは、どの資料でも使われているので、確定されていると言っていいでしょう。(「precomposed」を「結合済み」としている資料は極々僅少です)

すると「compose」はどうしても「合成」でなければなりません。それなのに「combining」にも「合成」という訳語を与えるのは、他にどんな理由があるのでしょう? 私にはまったく理解できません。

一方、良質の資料では、かならず

combining = 結合
composition = 合成

と訳語も明確に使い分けられており、混同されることはありませんし、語感上もその方がしっくりきます。私もここではそれに倣い、この訳語にすることにしました。

ちなみに、こうした用語の混乱は、実は日本だけではないようです。本家の Unicode用語集 を見ていると明らかに「combining character sequence」と「composite character sequence」を同義語にしているので、ワケがわかりません。

結局のところ、Unicode正規化の資料を読む時には、どちらのことを指しているかを「文脈で判断する」しかないのが実情です。

なお、このページを公開した当初は日本語訳の参考となる整理された資料がなかったのですが、今ではちゃんと対訳表があります。
Unicode 用語 英日対訳表
Unicode 用語 日英対訳表

これは上記の「結合」「合成」の混乱がほとんど見られない非常に優れたものです。日本では今後この対訳表に沿った訳語が使われることを強く望みます。