この文章を書いている現在 Windows98 はまだ出荷されていませんが, Word98 は 1998年3月に出荷されました。 Word98 には Windows98 にも附属すると考えられている新しい MS明朝がオプションでついており, WideChar API を使って表示することによって 従来は用意されていなかった文字を表示することができます。 また, IME98 もこれらの新しい文字を入力できるように拡張されています。
簡単な表示プログラムを作って動かしてみました。 まず結果をお見せしましょう。
では, 解説。 行の一番左にあるのが, 新しい MS 明朝 12pt のフォントを使い, TextOutW API で表示させた文字です。 次の UCS= が文字の UCS2 によるコード, CP932= が WideCharToMultiByte API を使って変換したコードページ932 の値(変換できなかったものは 3f と書いてある), NAME= というのが文字の名前です。
まず, WideCharToMultiByte API の返す結果自身は以前と変化ありません。 しかし, CP932 に変換できない文字でもグリフが割り当てられています。
まず 005C は相変わらず円記号を表示しますが, 00A5 でも円記号になります。 これは以前の Win95 でも同様だったのですが, それに加えて 00A2, 00A3, 00A6, 00AC の 「今まで全角バリアントしかなかった文字」 にもことごとくグリフが割り当てられたことが注目すべきでしょう。 しかもちゃんとみな全角バリアントの半分の幅で表示されています。
また, JIS X 0201 に厳格な人間は 「(CP932の)7Eh はオーバーライン(UCS:203e)のはず」 と言っていたのですが, この字のグリフもちゃんと入っています。 これも半角になっています。
JIS X 0208 の方では, やはり JIS と Windows で解釈の割れていたセント記号やポンド記号などに 全角でないグリフも割り当てられました。 しかし半角で表示するようです。 WAVE DASH もグリフが割り当てられていますが, なんと TILDE と上下逆になってます。 REVERSE SOLIDUS ですが, 相変わらず円記号になってしまっています。 DOUBLE VERTICAL LINE には何も割り当てられていません。
さて, WindowsNT で JIS X0201/0208 にない文字を Unicode と外字を使って処理する XKP 規格では, フォント搭載のレベル規定において, JIS X0221 (UCS) の附属書1 にある (1) から (7) までの日本語文字レパートリのうち, (5) を除く全部の部分集合を対象にしています。 新しい MS明朝では, 基本的にこの路線にそって文字が追加されたものとみなせますが, いろいろ変なところもある, というのが上の結果からも見て取れると思います。 また SHIFT_JIS との対応関係という点では従来とぜんぜん変化なく, JIS の規格票に書かれている対応関係とのずれは解消されていないことがわかります。
JIS X 0221 附属書1 は日本文字部分レパートリとして UCS BMP に対する 7つの部分集合を定義していますが, この部分集合と従来の JIS X 0201, 0208, 0212 との関係は大変複雑なものになっています。 表にして示すと下のようになります。
| JIS X 0221 附属書1. | 字数 | JIS X 0201 ラテン | JIS X 0201 片仮名 | JIS X 0208 非漢字 | JIS X 0208 漢字 | JIS X 0212 非漢字 | JIS X 0212 漢字 | JIS X 0221 新規追加 | その他 |
|---|---|---|---|---|---|---|---|---|---|
| (1)基本日本文字集合 | 6,884 | 94 | 0 | 432(*注1) | 6,356(*注1) | 0 | 0 | 1 (tilde) | 1 (space) |
| (2)追加非漢字集合 | 1,909 (*注2) | 0 | 0 | 0 | 0 | 260 | 0 | 1,649 | 0 |
| (3)追加漢字集合 | 918 | 0 | 0 | 0 | 0 | 0 | 918 | 0 | 0 |
| (4)補助漢字集合 | 4,883 | 0 | 0 | 0 | 0 | 0 | 4,883 | 0 | 0 |
| (5)その他の漢字集合 | 8,745 | 0 | 0 | 0 | 0 | 0 | 0 | 8,745 | 0 |
| (6)互換用全角英数字集合 | 94 | 0 | 0 | 89 | 0 | 0 | 0 | 5(*注3) | 0 |
| (7)互換用半角仮名集合 | 63 | 0 | 63 | 0 | 0 | 0 | 0 | 0 | 0 |
| 附属書1になし | 8 | 0 | 0 | 2(¥, ̄) | 0 | 6(*注4) | 0 | 0 | 0 |
| 合計 | 23,504 | 94 | 63 | 523 | 6,356 | 266 | 5,801 | 10,400 | 1 |
全部あわせると, 非漢字が 2,602字(附属書1にない 8字を除くと 2,594字), 漢字が 20,902 字定義されています。
JIS X 0208, 0212 に含まれるにもかかわらず, 日本語文字レパートリに含まれない字が 8文字もあるのは驚きです。 (¥, ̄が含まれないというのはあくまで JIS X 0201 と 0208 を同時に使用し, かつ重複定義を許容する場合の話です。)
XKP では, この 7つの部分集合のうち, (5) を除く 6つの集合に対する適合性がある, としています。 XKP では, JIS X 0221 部分集合の (1)+(6)+(7) を「基本文字セット」, (2)+(3)+(4) を「拡張文字セット」と呼んでいます。 さらに, 従来から Windows の日本語文字集合にあった文字で, JIS X 0201/0208 にない文字を「互換文字セット」と呼んでいますが, この 3つの文字集合と上記の JIS X 0201/0208/0212/0221 との関係がまた複雑です。 また表にしてみます。 ただし「シフトJIS との変換」は問題にせず, 「適当なグリフが割り当てられているか」のみを考えることにします。
「Windows日本語」の区分については, 別に「JIS記号の UCS BMP へのマッピングの問題」という文を用意したので, そちらをご覧ください。 “[”と“]”でくくった数値は JIS/NEC/IBM 間で重複する文字を勘定に入れた場合の値です。 「IBM SBCS」と書いた 24文字は DOS/V 日本語コードページで 00-1F までに割り当てられていた罫線などのことです。 実は従来の MS明朝にもこれらのグリフは存在しましたが, WideChar でないと出力できないので, 世の中にはほとんど知られていませんでした。
| JIS X 0221/0201/0208/0212 | Windows日本語 | Windows なし | ||||||
|---|---|---|---|---|---|---|---|---|
| JIS部分 | NEC拡張 | IBM拡張 | IBM SBCS | XKP拡張 | ||||
| (1)基本日本文字集合 | JIS X 0201 ラテン | 94 | 93 | 0 | 0 | 0 | 1(OVERLINE) | 0 |
| JIS X 0208 非漢字 | 432 | 424(*注1) | 0[9](*注2) | 0[1](*注3) | 0 | 6(*注4) | 2(*注5) | |
| JIS X 0208 漢字 | 6,356 | 6,356 | 0 | 0 | 0 | 0 | 0 | |
| tilde, space | 2 | 2 | 0 | 0 | 0 | 0 | 0 | |
| (2)追加非漢字集合 | JIS X 0212 非漢字 | 260 | 0 | 1(*注6) | 0[1](*注6) | 0 | 259 | 0 |
| JIS X 0221 新規追加 | 1,649 | 2(*注7) | 73[83] | 10[22] | 17 | 1,547 | 0 | |
| (3)追加漢字集合 | JIS X 0212 漢字 | 5,801 | 0 | 0[279] | 279 | 0 | 5,522 | 0 |
| (4)補助漢字集合 | ||||||||
| (6)互換用全角英数字集合 | JIS X 0208 非漢字 | 89 | 89 | 0 | 0 | 0 | 0 | 0 |
| JIS X 0221 新規追加 | 5 | 3(*注8) | 0[2](*注9) | 2(*注9) | 0 | 0 | 0 | |
| (7)互換用半角仮名集合 | JIS X 0201 仮名 | 63 | 63 | 0 | 0 | 0 | 0 | 0 |
| (1)-(7)合計 | 非漢字 | 2,594 | 676 | 74[95] | 12[26] | 17 | 1,813 | 2 |
| 漢字 | 12,157 | 6,356 | 0[279] | 279 | 0 | 5,522 | 0 | |
| トータル | 14,751 | 7,032 | 74[374] | 291[305] | 17 | 7,335 | 2 | |
| その他 | JIS X 0208 非漢字 | 2 | 2 | 0 | 0 | 0 | 0 | 0 |
| JIS X 0212 非漢字 | 6 | 0 | 0 | 0 | 0 | 6 | 0 | |
| その他非漢字 | 124 | 3(*注10) | 0[2](*注11) | 1[2](*注11) | 7 | 113(*注12) | --- | |
| その他漢字(CJK漢字) | 47 | 0 | 0[47] | 47 | 0 | 0 | --- | |
| その他漢字(互換領域) | 34 | 0 | 0[34] | 34 | 0 | 0 | --- | |
| 合計 | 非漢字 | 2,726 | 681 | 74[97] | 13[28] | 24 | 1,932 | 2 |
| 漢字 | 12,238 | 6,356 | 0[360] | 360 | 0 | 5,522 | 0 | |
| トータル | 14,964 | 7,037 | 74[457] | 373[388] | 24 | 7,454 | 2 | |
2022 BULLET および 2027 HYPHENATION POINT は単なる点のようなものが表示されるのですが, もともとの JIS X 0221 の規格でもこの 2字は点みたいな形をしているので, いちおう実装されているものとみなしました。 2000-200F, 2028-202E は不可視なので実装されているのかどうか不明ですが, これもいちおう実装されているものとみなしました。
どの字が全角でどの字が半角になっているかも調べたかったのですが, 根性が切れたのでまた次回ということにします。