Unicodeの基礎知識
文字,グリフ,フォント
まず最初に,文字(character),グリフ(glyph),フォント(font)の3つの語の定義を理解しないといけない.
これらの定義は決して自明なものでもないし,
一般の人が漠然と理解している文字・フォントという語の定義とも一致しているわけでもないので,
Unicodeで文字とかフォントとかいった場合に何を意味しているか・どんな観点で話を進めようとしているかを理解していないと混乱してしまう.
Unicodeでは,文字,グリフ,フォントという語はだいたい次のような意味になっている.
[Unicodeの定義そのままだとわかりにくいので,(危険だとしりつつ あえて)平易な表現に直してある.
正確な定義についてはUnicode::Glossaryを参照.]
単語 |
意味 |
文字 |
言語において意味をもつ最小単位.
特定の形状のことを指すものではなく,抽象的な意味と抽象的な形状のことを指す.
読者の理解を助ける意味で必要なので視覚的な表現(特定の形状)が示されている場合があるけども,
Unicodeで文字といった場合には,特定の形状のことを言っているのではないことを理解しておく必要がある.
Unicodeでは視覚的表現・形状をグリフと呼ぶ.
|
グリフ イメージ
Glyph image
|
何らかの表示媒体(コンピュータのディスプレイや紙などの)上に描いた グリフ表現の具体的な画像.
|
グリフ |
(1)1個以上のグリフイメージを表現する抽象形式.
(2)単にグリフイメージの同義語としてグリフという語を使う場合もある.
Unicodeにおいては,ある文字を具体的な画像表現に直す場合に,複数個のグリフを使ってもよいことになっている.
描画エンジンが,複数のグリフを組み合わせ,適切な位置に配置することで特定の文字の画像表現を作り出すことがありうる.
|
フォント |
文字の視覚的表現のために使われるグリフを集めたもの.
フォントはたいていの場合,大きさ,傾き,太さ,ヒゲのあり・なしといった変数と関連付けられていて,
これらの変数に特定の値を与えると,グリフの具体的な画像表現の集合が得られる.
|
こういう風に説明すると,Unicodeでは,ものすごく厳密に各語の定義が与えられていて,
厳格に区別されているかのような誤解をもってしまうのだけど,
実際にはそうではなく,ユニコード コンソーシアム自身も“文字”ひとつを定義するのにもさまざまな難しい問題があること認識している.
-
文字とグリフの間に明確な境界があるわけではない.
-
したがって,ある人がグリフの違いと判断している視覚的な差異を他の人が違う文字だと主張するということがありうる.
たとえば,ナンバーサイン(#)とシャープ(♯)は違う文字なのか同じ文字なのかはっきりしない.
[JISではとりあえず違うコードポイントがわりあたっているけど,その経緯についてはいろいろな意見があるそうだ.
逆のパターンもあって,
ギリシャ文字のオメガ(Ω)と電気抵抗を表す単位のオーム(Ω)は
歴史的にも同じ活字印を使ったことがわかっている,これは仮にその文字を使っただけで,意味は違うということで,
Unicodeでは別の文字としている(Unicodeではグリフではななく文字を識別することになっているから)けど,
JISではオメガとオームは同じ文字としている.]
-
また,ある文脈ではグリフイメージの違いであるものが, 別の文脈では違う文字になる場合もある.
たとえば,数学では普通のR(LATIN CAPITAL LETTER R)と太字のR(U+1D411 MATHEMATICAL BOLD CAPITAL R),
実数空間を参照するための白抜き文字のR(U+211D DOUBLE-STRUCK CAPITAL R)は違う文字だと主張している.
[2重打ち(DOUBLE-STRUCK)のアルファベットは,もともとは,数学で使うものだけをUnicodeに含めるつもりだったみたいで,
複素空間C,H(何だっけ?),自然数空間N,P(何だっけ?),有理数Q,実数空間R,整数空間Zだけが16進4桁の小さい番号をもっている.
結局あとからA〜Zの全部を取り込むことになって,Aなどは16進5桁の大きい番号になってしまっている.
つまりDOUBLE-STRUCKについては文字コードを比較するとA>R(AはU+1D538,RはU+211D)になってしまっていて,悩ましいなど,変な問題も取り込んでしまっている.
これについてはUnicodeで文字順序はコード値を比較するのではなく,別に定めるコレーティングシーケンスに従うことになっているので
(UTS #10: Unicode Collation Algorithm),
問題ないという主張もあるかもしれないけど,あまり現実的ではなく,悩ましいことに違いはない.
参考 The Unicode Character Code Charts::Mathematical Alphanumeric Symbols]
-
微妙な発言もある.
たとえば“Å”はアルファベットの“A”と“○”に分解できるとか言い出している[1].
だとすると,“爆”は“火”+“暴”,“森”だって3個の“木”に分解できそうだし,
それこそ“1+1=田”なんじゃないの?という気もしてくる.
-
Unicodeというと,日本人が真っ先に話題にするのがCJK統合漢字で,
同じ意味の文字であれば見た目の違いにこだわらずに統合しようとするという印象をもっていると思う.
確かに初期のUnicodeのコンセプトは同じ意味の文字はひとつのコードポイントにまとめるという方針だったけども,
今ではむしろ逆で,何でもかんでも突っ込んでしまっている.
-
たとえば,全角のコンマ(U+FF0C FULL WIDTH COMMA),ピリオド(U+FFOE FULL WIDTH FULL STOP),
はてなマーク(U+FF1F FULL WIDTH QUESTION MARK),びっくりマーク(U+FF01 FULL WIDTH EXCLAMATION MARK)など,
おかまいなしに追加されている.
[参考 The Unicode Character Code Charts::Halfwidth and Fullwidth Forms (Range: FF00-FFEF)]
[これは,Unicodeと他の文字コードとの変換を可逆にしたい
(たとえばシフトJISコードのテキスト文書をUnicodeに変換したのち,再びシフトJISコードにもどしたら,もとの文書と完全に一致している状態にしたい)
という要求があるためだと思うんだけども,どうだろう.]
-
ほかにも,数学用の文字,
たとえば,ベクトルや集合の記号に使う太字(U+1D468 MATHEMATICAL BOLD ITALIC CAPITAL Aなど)や
ラプラス変換などで使う飾り文字みたいなの(U+1D504 MATHEMATICAL FRAKTUR CAPITAL Aなど),
白抜きの文字(U+1D538 MATHEMATICAL DOUBLE-STRUCK CAPTAL A)など,
それってグリフの違いなんじゃないの?と思えてくるような文字がどんどん追加されている.
[参考 The Unicode Character Code Charts::Mathematical Alphanumeric Symbols]
文字レパートリー,符号化文字集合,エンコーディング スキーム
抽象度 |
用語 |
意味 |
高 |
文字レパートリー
Character Repertoire
|
順序付けされていない文字の集合. |
↑ |
符号化文字集合
Coded Character Set
|
文字レパートリーに一意の非負整数値をつけたもの.
文字に与えれた非負整数値のことをコードポイント(Code Point)という.
|
↓ |
符号化形式
Encoding Form
|
符号化文字集合で与えられた整数値をコンピュータ上で表現できるバイト列に対応させたもの.
具体的にはUTF-8とUTF-16がある.
|
低 |
エンコーディング スキーム
Encoding Scheme
|
エンコーディング フォームに加えて,バイト直列化の方式を考慮したもの.
具体的には,UTF-8,UTF-16,UTF-16BE,UTF-16LE,UTF-32,UTF-32BE,UTF-32LEの7種類がある.
以前は,Unicode Transformation Format(UTF)と呼ばれていた.
|
-
エンコーディング スキームのUTF-16とUTF-32はリトルエンディアンかビッグエンディアンかをBOM(Byte Order Mark)で判断する方式
(参考 The Unicode Standard: 3.10 Encoding Schemes).
-
エンコーディング フォームと
エンコーディング スキームの両方に同じ名前がついてるものについて,どちらの意味で使っているかを区別する必要がある場合には,
UTF-8エンコーディング フォーム,UTF-8エンコーディング スキームのように語を補う.
はたいたかし
2004-04-26