Unicode仕様の付録にEast Asian Width(EAW)という文書があります[*1]。これは東アジアのレガシーな文字集合(日本では主にシフトJIS)との相互運用のためのUnicode文字の参考特性についての仕様です。
1. EAWの目的
EAWは次のような実装のための参考情報です。
・東アジアのレガシーが符号化文字とUnicodeの相互運用
・東アジアと西欧のタイポグラフィーと行レイアウトの両方のサポート
・東アジアの文字を含む、マークアップされていない文字にフォントを関係つけるため
2.概要
EAWの概要を紹介します。
(1) 半角文字と全角文字
東アジアのレガシーな符号化において1/2Em幅の文字を半角(Halfwidth)といい、Em幅の文字を全角(Fullwidth)という。レガシーな符号化では半角は1バイトであり、全角は2バイトである。Unicodeではもうそのような区別はない。
(2) Unicode文字のデフォルト特性値
Unicodeの文字データベースでは、各Unicode文字にデフォルト幅特性を与えている。これは次の6つの値の一つである:
1) 曖昧
あるときは広く、あるときは狭くなる文字幅特性。曖昧な文字の幅を決定するには、文字コードに含まれていない情報が必要である。この例は、ギリシャ文字やキリル文字であり、東アジアのレガシーな文字集合では広くなり、非東アジアではない用途では狭くなる。
Unicodeから東アジアのレガシーな文字集合に対応つけるときは、全角文字にマップする。非東アジア以外の文字集合に対応つけるときは通常の(狭い)文字にマップする。
2) 全角
UnicodeでFullwidthと定義されている文字すべて。
U+FF01(U+0021(!)の全角文字)~U+FF5E(U+007E(チルダ)の全角文字)
U+FF60(全角幅左白括弧)、FF61(全角幅右白括弧)、FFE0~FFE6(全角記号の異形文字、全角通貨記号など)
3) 半角
Unicodeで明示的にHalfwidthと定義されている文字。
U+FF61~FF64(半角句点、半角鍵括弧、半角読点)
U+FF65(半角中点)
U+FF66~FF9F(半角カタカナ)
Unicodeから東アジアのレガシーな文字集合に対応つけるときは、半角文字にマップする。非東アジア以外の文字集合にはマップできない。
4) 広い(Wide)
漢字、ひらがななど。
Unicodeから東アジアのレガシーな文字集合に対応つけるときは、全角文字にマップする。非東アジア以外の文字集合にはマップできない。
5) 狭い(Narrow)
常に狭い文字である。狭い文字には対応する明示的な全角または広い文字がある。ASCII文字は、Unicodeに全角文字が定義されていることから狭い文字の例である。
Unicodeから東アジアのレガシーな文字集合に対応つけるときは、半角文字にマップする。非東アジア以外の文字集合では通常の(狭い)文字にマップする。
この定義による限り、ASCIIの「A」のような文字を全角形で表示することはできないことになる。
6) 中立(非東アジア)
他の文字である。東アジア文字集合の中には含まれない。
任意の処理において、コンテキストに応じて、文字の幅は最終的に広いか狭いのどちらかに決定する。
3.問題点
EAWは、(1)レガシーな文字符号化とUnicodeの文字コードの相互変換を行なうためのものであるとともに、(2)東アジアと西欧のタイポグラフィーと行レイアウトの両方のサポートとされている。
文字コードの変換については、EAWのような対応関係をつけるのはやむを得ないだろう。
しかし、行レイアウトは、新しいレンダリング方式はフォントの選択やソースの文字コードの範囲をこえた、文脈情報を使って文字の幅(Wide-Narrow)を決定するようになっているが、この仕様書はそういう変換を追跡していないとされている(仕様書の「現代のレンダリング実践」の項)。
しかし、EAWではASCIIコードに属していた文字コードは、狭い(Narrow)文字であり、Wideにならない。ところが、一方、ラテン補助文字、拡張文字、キリル文字、ギリシャ文字はNarrowにもWideにもなる。
具体例で示すと、たとえば、「A」(ASCIIに属する)という文字はWideにはならないので、「A」をWideにするには、「A」に対応する「A」という全角文字コードに変換しなければならない。ところが、たとえばギリシャ文字、日本語文脈中ではWideであり、ギリシャの標準フォントを指定するとNarrowになる。
つまり、ASCII文字は全角文字が別に定義されているために、幅の操作がとても不便なのだが、ギリシャ文字の幅の操作は簡単という、なんだか首尾一貫しないことになっている。
今後は、レガシーな文字集合(シフトJIS)において1バイト文字か2バイト文字のどちらに属しているかによって取りうる文字の幅に制限を設けるというEAWのような奇妙なやり方は廃止するほうが良いだろう。
〔追記〕
WideとNarrowの違いとして文字の幅という解釈を強調しすぎたようなので反省(次の項を参照)。定義にはあまり明確に書かれていないが、仕様書のOverviewでは、組版においてWideはIdeographのような挙動(1文字毎に改行ができ、縦組みで正立)を示す。一方、Narrowは、単語あるいは一連の文字の固まりを保持し、また、縦組みでは横倒しになる、とされている。このように、WideとNarrowの相違点は、文字の幅だけではなくて組版のときの文字としての挙動の違いという捕らえ方をするとわかりやすい。
また、勧告の項には、Wide/Narrowについて「データの処理と表示に際しての振る舞いについて」という項目があり、次のようになっている:
①Wide文字は表意文字のように振舞う。
②Narrow文字は、例えば改行において西欧の文字のように振舞う。また縦組みでは横倒しになる。
③曖昧な文字は、言語タグ、スクリプト識別、対応フォント、データのソース、マークアップなどのコンテキストに応じてWideまたはNarrowのように振舞う。コンテキストを確立できないときは、デフォルトではNarrow文字として扱われるべきである。
Basic Latinの文字はNarrowの値をとるのみとし、一方、ギリシャ文字やキリル文字は曖昧で、コンテキストによってNarrowになったりWideになったりするというような扱いの相違がある。
EAWでは、文字としての振る舞いの相違点の根拠は、Basic LatinはJIS X0201とJIS X0208の両方にあり、ギリシャ文字やキリル文字はJIS X0201になく、JIS X0208のみにあるということになる。しかし、これはレイアウトと改行処理における、文字の挙動の相違を説明する理由にはなりえないのではないか?
[*1]Unicode Standard Annex #11 East Asian Width
■CASオンラインショップでCAS-UBのユーザー登録することで、誰でも30日間だけ無償でご利用いただくことができます。