東アジアの文字集合の概要: 日本語


1. JIS X 0208

もと JIS C 6226 という名前で 1978 年に制定され, 非常によく普及しました。 (1987年に JIS X 0208 に改名)。 1983 年の改定が 1978年版に対して記号の追加・漢字の符号位置入れ替えなどの 大幅な変更を伴ったため, 大きな混乱が起き, 現在もまだ混乱したままです。 ISO では 1978年版と 1983年版は別の文字集合として登録されています。 また 1990年版は 1983年版に対して 2文字追加したので, 1983年の新たな版として ISO に登録されています。 最新版は 1997年版ですが, 1990年版に対して変更はしていません。

2. JIS X 0201

もと JIS C 6220 という名前で 1976年に制定された 1バイトの文字集合で, ラテン文字集合と仮名文字集合の 2つを定義しています。 前者は ISO 646 の日本語版です。 長い間改定されなかったのですが, 国際規格との整合性を取るために 1997 年に本文が全面的に書き直され, 明確化されました。

ASCII と JIS X 0201 のラテン文字集合の違いは 2個所あります。

コードASCIIJIS X 0201
5C REVERSE SOLIDUS(\) YEN SIGN(¥)
7E TILDE OVER LINE

ただし実際には 5C に YEN SIGN を使い, 7E に TILDE を使っている実装が珍しくありません。 理由のひとつは ASCII/ISO 646 自体が歴史的に TILDE と OVER LINE を別な文字とみなしていなかったことにあります。 1997年の JIS X 0201 改定では, 「送信者と受信者の間で明示的な合意がある場合は」 TILDE と同じ字形を OVER LINE として使ってよいことが明記されました(附属書2)。

JIS X 0208 が使えない機種が多いころには仮名文字集合も重要だったのですが, 現在は JIS X 0208 の仮名を使えば必要ないので, 0201仮名は斜陽化の道をたどっています。 重複符号化という点で考えても仮名が二種類あるのは不都合です。 特にネットワークでやり取りする場合には この仮名文字集合がない方が便利な場合が多いこともあり, ISO-2022-JP では仮名文字集合を使わないようにしています。 JIS X 0201 仮名を使っただけで罵詈雑言を浴びせる人間も珍しくありません。 とは言え仮名文字集合もまだ結構使われており, 廃止されるにはまだまだ時間がかかりそうです。

3. Shift JIS

非常によく普及しており, DOS でも Macintosh でも Shift JIS しか読み書きできないアプリケーションが大部分です。

Shift JIS は JIS X 0201 と JIS X 0208 を混在可能な 8bit の文字集合で, 21-7E に JIS X 0201 のラテン文字集合(または ASCII), A1-DF に JIS X 0201 のカナ文字集合を置きます。 JIS X 0208 の方は 1文字を 2バイトで表します。 1バイトめが上記の JIS X 0201 の文字と区別できるようにするため,

1バイトめ81-9F,E0-FC (60通り)
2バイトめ40-7E,80-FC (188通り)

の範囲を取ります。 2バイトめはちょうど 2区ぶんあるので, 1バイトめの対応関係は以下のようになります。

JIS X 0208 (GL)21/2223/2425/2627/2829/2A2B/2C2D/2E2F/30
Shift JIS 81 82 83 84 85 86 87 88
JIS X 0208 (GL)31/3233/3435/3637/3839/3A3B/3C3D/3E3F/40
Shift JIS 89 8A 8B 8C 8D 8E 8F 90
JIS X 0208 (GL)41/4243/4445/4647/4849/4A4B/4C4D/4E4F/50
Shift JIS 91 92 93 94 95 96 97 98
JIS X 0208 (GL)51/5253/5455/5657/5859/5A5B/5C5D/5E3F/60
Shift JIS 99 9A 9B 9C 9D 9E 9F E0
JIS X 0208 (GL)61/6263/6465/6667/6869/6A6B/6C6D/6E6F/70
Shift JIS E1 E2 E3 E4 E5 E6 E7 E8
JIS X 0208 (GL)71/7273/7475/7677/7879/7A7B/7C7D/7E
Shift JIS E9 EA EB EC ED EE EF

Shift JIS 1 バイトめ F0-FC の領域はベンダーやユーザーの拡張用です。

いっぽう 2 バイトめは 1バイトめが奇数か偶数かによって変わります。

JIS X 0208 の 1バイトめ 奇数偶数
JIS X 0208 の 2バイトめ 21-5F 60-7E21-7E
Shift JIS の 2バイトめ 40-7E 80-9E9F-FC

Shift JIS は もともと CP/M-86 や MS-DOS で日本語を使うために考案されたものです。 1980年ごろのパソコンでは JIS X 0201 のラテン文字を (ISO2022 でいうところの) GR に, カナ文字を GL に, 余ったところにベンダー固有の記号類を置く, というのが一般的でした。 このうち記号類を潰して, 空いた所に離れ業で無理矢理 JIS X 0208 の文字を押し込んだのが Shift JIS です。 ラテン文字・カナ文字しか使えない機種も多かったので, そういう機種に対する上位互換性があること, エスケープシーケンスなどの複雑な処理がいらなかったこと, MS-DOS の普及率のよさ, などが成功の理由でしょう。

もちろん欠点も多くあります。

ぐらいは簡単にあがるでしょう。

4. JIS X 0212-1990 (補助漢字)

JIS X 0208 の漢字などの不足を補うために制定されました。 漢字 5,801 字と非漢字 266 字の合計 6,067 字が定義されています。

JIS X 0208 の文字が政令漢字 (常用漢字・人名漢字) および人名・地名用の漢字を主体としているのに対し, JIS X 0212 が何を主体としているのかははっきりしない点があります。 印刷会社や新聞社・データベース作成機関・メーカーなどの漢字表を元に, 頻度で取捨を行ったようですが, 大漢和辞典にあるかどうかを取捨基準に加えているため, 結果として正字が多く, 異体字は少なくなっています。 経験的に, 中国人の姓, 古典文学に出てくる文字, 図書館業務などの目的に役立つ文字が多く含まれています。 池田証寿氏(現北海道大学, もと信州大学)の調査によると, 司馬遷の史記に出てくる 4,883 字のうち, JIS X 0208 にない文字は 1,340字 あったが, そのうち 957 字は JIS X 0212 にあったそうです。 つまり JIS X 0208 だけではわずか 72.5% なのに JIS X 0212 を加えることで 92.2% をカバーできるわけです。

いっぽう,

等に関して批判があります。

もっとも Shift JIS については, A1-DF の半角カナをつぶせば簡単に入るのですが…。 漢字だけであれば 62区しかないので, 半角カナ領域の半分, たとえば A140..BFFC の範囲に収まります。

5. EUC-JP

Shift JIS が ISO2022 に対応していない, 2バイトめが ASCII と誤認識される欠点がある, などの反省をもとに作られた 8bit の集合です。 ISO2022 の言葉でいうと GL=G0=ASCII, GR=G1=JIS X 0208, G2=JIS X 0201 のカナ, G3=JIS X 0212 に割り当てられています。 G2, G3 の文字を使うときは GR を使い, その前にそれぞれ SS2 (8E), SS3 (8F) をつけます。 この結果 JIS X 0201 カナは 2バイトコード, JIS X 0212 は 3バイトコードであるかのように見えます。 現実には G2/G3 は使えないアプリケーションが多いようです。

なお SS2, SS3 の後で GR を使うのは ISO2022 に違反する疑いがあったのですが, ISO2022 自身が改定されて, GR を使ってもいいことになりました。

EUC とは Extended Unix Code の略で, その名のとおり Unix 系の OS で標準の日本語文字集合になっていることが多いようです。 もっとも Shift JIS が標準の Unix 系 OS も多いし, EUC-JP が標準でも Shift JIS も選べるようになっている場合が少なくありません。

(1999-02-28 追記) HP-UX や AIX では Shift JIS が標準です。 Solaris は EUC が標準ですが 2.6 以降 Shift JIS も選択できるようになりました。 JVC の CDE/Motif 技術検討 WG のページに各社の EUC の状態調査結果があります。

EUC の欠点は, 1バイトめと 2バイトめの範囲が等しい (A1-FE) ため, なにかの拍子に 1バイトめと 2バイトめが泣き別れになってしまうと, そのあと 2バイト文字の終わりまでの全ての文字が化けてしまうことです。 Shift JIS でも化けることはありますが, おおむね後続の 2..3字程度しか化けません。

第二の欠点は, これだけ普及している Shift JIS と, バイト列を見ただけでは区別がつかないことです。 もちろん heuristic に見分ける技法はいくつも開発されていますが, 決定的なものはありません。

第三の欠点は, せっかく ISO2022 に従っておきながら, その利点である拡張性を生かせていないことです。 G3 の X0212-1990 がほとんど役に立っていないのが残念です。

6. ISO-2022-JP

Shift JIS にしても EUC-JP にしても 8bit コードなので, 7bit 環境では通常 ISO-2022-JP を使います。 ISO-2022-JP は RFC1468 で定義されています。 JIS X 0208 の 1997年版の附属書2でも定義されています。 G0 のみを用い, 文字集合の切り替えには以下の ISO の指示エスケープシーケンスを使います。

ASCII ESC ( B
JIS X 0201 ラテン文字集合 ESC ( J
JIS X 0208 (1) ESC $ @
JIS X 0208 (2) ESC $ B

JIS X 0208 を指示するエスケープシーケンスは 2種類あります。 ISO のエスケープシーケンスとしては(1)が 1978年版, (2)が 1983年版を意味しますが, 現実にはそういう意味では使われていないので, JIS X 0208 の附属書では後者が JIS X 0208 の 1990/1997年版, 前者は 83JIS で行った 26組の異体字入れ替えを元に戻したもの, としています。 (さらに「明示」することを条件に, 異体字入れ替えや 83JIS 以降の追加文字の実装の違いも許容している)

また, RFC1468 には ESC ( B と ESC ( J, ESC $ @ と ESC $ B の区別をしないシステムがあることを述べています。

各行の初期状態は ASCII とし, 行の終わりでは ASCII に戻します。

JIS X 0201 仮名文字集合が使えない, という特徴があります。 もっとも実際には "ESC ( I" で仮名文字集合が使えるようになっているアプリケーションも少なくありません。

7. ISO-2022-JP-2

ISO-2022-JP をさらに拡張して, 補助漢字(JIS X 0212) をはじめ, 中国の GB2312, 韓国の KS C 5601 を G0 で, ISO8859-1 (西欧), ISO8859-7 (ギリシャ)の右側を G2 で使えるようにしたものです。 RFC1554 で定義されています。 もともと Mule 多言語エディタに由来します。

ISO-2022-JP に加えて, 以下のエスケープシーケンスを使います。 G2 の文字は SS2 (ESC N) で呼び出します。

GB2312 ESC $ A
KS C 5601 ESC $ ( C
JIS X 0212 ESC $ ( D
ISO8859-1 ESC . A
ISO8859-7 ESC . F

「ISO-2022-JP-2」という文字集合名に対応していないアプリケーションが多いので, 名前は「ISO-2022-JP」のまま ISO-2022-JP-2 のエスケープシーケンスを使う人もいます。

ISO-2022 のエスケープシーケンスを使っているにもかかわらず, ISO-2022-KR (RFC1557) や ISO-2022-CN (RFC1992) に対する上位互換性がない, という欠点があります。 ISO-2022-JP-2 の方が先にできたんだからやむを得ないことではありますが。

よく似た文字集合に, X Window で使われる CTEXT(Compound Text) という形式がありますが, 指示エスケープシーケンスが少し異なっています(JIS X 0208 を指示するのに "ESC $ ( B" の 4バイトを使うなど)。 NetNews などに CTEXT で書いた記事が投稿されることがありますが, 省略します。

8. ISO-2022-JP-1

最近 RFC にはいりました。 (RFC2237) ISO-2022-JP に JIS X 0212 を追加したものです。 エスケープシーケンス等については ISO-2022-JP と ISO-2022-JP-2 を見てください。 XKP に関連して, NT5 での補助漢字サポートがうまくいけば, 使われる可能性もあるかもしれませんが, なんだかなあ。


文字コードの話に戻る