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

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

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

Unicodeの特殊な文字

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

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

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

>> download(Mac OS X 用)

左に「ポ」と入力して [NFD] ボタンを押すと、右に変換されたポが表示されます。この右のポをマウスで触ってみましょう。「ホ」と「半濁音」の2つに分かれていますね。半濁音だけ選択してカットとペーストを繰り返すと面白いです。「1文字が2文字のデータで構成されている」とはどういうことなのか、実感してもらえたと思います。

このソフトは選択した文字のコードポイントが下に表示されるようにしてあります。2つのポが異なるデータであることも一目瞭然です。

もっと興味深い文字を見てみましょう。

[Get Glyph] ボタンの下に「01D6」とコードポイントを入力し、ボタンを押します。上にその文字が表示されます。小文字 u に音声記号が付いた文字ですね。[NFD] ボタンを押して変換してみます。なんと、2文字ではなく3文字で構成されていることが分かります。

次に [Get Glyph] ボタンの下に2つのコードポイント「00FC 0304」を入力してボタンを押します(半角スペースを間に入れます)。まったく同じ字形が表示されますね。

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

3通りの同じ字形

この3通りの文字を「テキストエディット」にコピー&ペーストしてみましょう。

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

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

「結合」「結合文字列」

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

そして結合によって1文字と見なされるようになった複数文字のことを
結合文字列 Combining Character Sequence」といいます。

Unicodeでは、上の説明で登場した「ポ」などの文字を「音声記号がくっついている文字」と考えます。「ポ」を「音声記号の半濁音がくっついているホ」と見るわけですね。これを文字の形の見た目だけでなく、本当に文字データでも「音声記号がくっついている文字」にしたのが結合文字列です。

なお、これは覚えなくてもかまいませんが、結合文字列の中の音声記号は「結合文字 Combining Character」といいます。結合文字は “結合文字列” のためだけに用意された特殊な文字なので、単独で使われることはありませんし、単独で使ってもいけません。そして結合文字列「ホ+半濁音」の「ホ」の方は結合文字ではなく「基底文字 Base Character」と呼びます。

Mac OS X は “結合文字列” だらけ

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

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

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

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

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

補注

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

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

この2つ、意味がまったく異なるのですが、実は日本語訳にすると辞書的には「結合」「合成」のどちらも使えてしまいます。しかしUnicode用語として意味が違うのですから、日本語でもちゃんと訳語を分けておきたいところです。

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

Combining
Composition
Decomposition = 分解
Precomposed = 合成済み

最低限、この4つを区別できる訳語にする必要があります。下の2つは、どの資料でも使われているので、確定されていると言っていいでしょう。したがって Composition は「合成」にするべきです。

しかしなぜか Combining の方を「合成」と言う人がいます。最も多いのが Combining Character Sequence を「合成文字」と言っている例です。それならその人は Composition の訳語をどうしているのかというと、これがはっきりしません。はっきりしないのは当然です。Combining Character Sequence を「合成文字」にすると Composition の訳語を確定できなくなるので、混乱するしかないのです。

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

Combining = 結合
Composition = 合成

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

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

結局のところ、Unicode正規化の資料を読む時には、どちらのことを指しているかを「文脈で判断する」しかないのが実情です。(Combiningを「合成」にしている文書は書いている本人が混乱しているので本当は読まない方がいいのですが、中には「英語で完璧に理解している人」が日本語で不用意にそうしていることもあり、これが有用な資料になっていると読まないわけにもいかないので難しいところです)

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

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

「結合文字列」と「結合文字の並び」、どっちにする?

しかし私は、そうはいうものの、対訳表にない「結合文字列」だけは使わざるをえませんでした。対訳表では「結合文字の並び」となっています。あえて「動詞の名詞化」にしたこの見識はすばらしいと思います。でも実際にこれを文章の中で使ってみると「動詞」なのか「動詞の名詞化」なのかが曖昧になるので非常に悩ましい思いをしました。ダブルクォーテーションで挟んで名詞として強調してみたりもしましたが、結局は「結合文字列」の方が書くのも読むのもシンプルで分かりやすいと考えるようになりました。異論もあるとは思いますが、どうぞご容赦ください、