18.4.1.2 JIS 漢字

日本語では漢字や仮名といった数千字以上の文字を使います.1 バイトではせいぜい 28 = 256 種類の文字しか表せないので,1 バイトで漢字を表現することは不可能です.
このページでは, 日本語の文字を表現するための,JIS 漢字と総称される文字集合について説明をします.現在では,JIS X 0213(JIS 拡張漢字)がほぼ全ての環境で利用できる状況となっています.

JIS 基本漢字

日本語用に伝統的に使われている文字集合は.JIS X 0208(JIS 基本漢字)と呼ばれているものです.大雑把にいうと,次のような構造です.

  • 収められている文字は,記号類・数字・英文字・仮名・ギリシャ文字・キリル文字・漢字などの,7000 字弱(最新の 90JIS/97JIS では,6879 字)である.
  • そのうち大部分を占める漢字は,「よく使う」とされている第 1 水準と,それ以外の第 2 水準に分かれる.
  • 文字は 94×94 の正方形の表に割り当てられている.縦軸を「区」,横軸を「点」という.例えば「区」は 22 区 72 点である.

JIS X 0208 は,最初に 1978 年に JIS C 6226-1978 (78JIS) として定められましたが,その後 1983 (83JIS), 1990 (90JIS), 1997 (97JIS) に改訂が行われ,文字の追加や字形の変更,規定の明確化などがその都度行われました.現在では,後に説明する JIS X 0213 が後継となっています.

代表的な符号化の種類

先に書いたように,JIS X 0208 では文字を区と点で表すようになっていますが,実際には,これをそのまま使うわけではありません.前ページ hwb18.4.1.1 ASCII と JIS 仮名 で説明した ASCII も一緒に使えないと現実には困ります.そこで,JIS X 0208 や ASCII を一緒に符号化してビット列に変換して使うことになります.その代表的な符号化方法として,EUC-JP, ISO-2022-JP, Shift_JIS の3種類があります.

ISO-2022-JP(JIS コード)
ISO-2022-JP は,インターネットの電子メールで使われてきました.ASCII や JIS X 0208 の文字集合を切り替えることによって両文字集合の文字を表現します.具体的には,

ESC ( B → ASCII
ESC ( J → JIS X 0201 下半分(JIS ローマ字)
ESC $ @ → 78JIS
ESC $ B → 83JIS or 90JIS

といった文字列(エスケープシーケンスといいます.ESC は制御文字の1つです)で,「ここからはこの文字集合を使うよ」ということをその都度指定するわけです.JIS X 0208 の文字は,区・点をそれぞれ 21(16) から 7E(16) の範囲の数値にスライドし, 計 2 バイトで 1 文字を表現します.
この符号化方式は,最上位ビット(8ビット目)を使わないことが特徴ですが,一方で「今使っている文字集合は何か」を常に覚えておく必要があります.

EUC-JP(日本語EUC,単に EUC と省略されることも)
EUC-JP は,Linux 等の UNIX 系統の OS で使われてきました.ASCII とJIS X 0208 を共存させるために,JIS X 0208 の文字は,区・点を A1(16) から FE(16) の位置にスライドさせて表します.
また,JIS 仮名や,後で説明する JIS 補助漢字も表すことができるようになっています.この符号化の特徴は,最上位ビットを見るだけで,その文字が ASCII か否かがわかるということです.一方,JIS 仮名には 2 バイトが,JIS 補助漢字には 3 バイトが必要になっています.
Shift_JIS(シフト JIS,単に SJIS と省略されることも)
Shift_JIS は,Windows や Macintosh で伝統的に使われている漢字コードです(実際に両 OS で使われているのは亜種です).符号化方式としては,JIS X 0201 を動かさずに,JIS X 0208 も表現できるようにした方式です.具体的には,JIS X 0201 で使われている部分はそのまま採用し,そうでない部分(81(16) から 9F(16) までと,E0(16) から EF(16) まで)を第 1 バイトとした部分に JIS X 0208 の文字集合を押し込めています.特徴は,いわゆる半角カナが 1 バイトで表現でき,漢字も 2 バイトあれば足りるということです.しかし,無理に押し込んでいることから拡張性が低く,また漢字を表すときの 2 バイト目に 80(16) 未満の値が現れてしまうという問題もあります.

以下に,3 つの符号化方式をまとめた表を載せておきます.ISO-2022-JP(-1) ではコードが重複しているように見えますが,実際はエスケープシーケンスを使って切り替えているために問題は起きません.数字はみんな 16 進数で,また #n は第 n バイトを表しています.

CP932

Windows で伝統的に使われている漢字コードは,正確に言うとシフト JIS ではなく,CP932 と通称されるものです.詳しい事項は省きますが,プログラミングを行うときなどにシフト JIS と CP932 の些細な違いが問題になることがあります.

JIS 補助漢字

JIS X 0208 には 7000 字弱しか文字が含まれていないため,それを補完する文字集合として JIS X 0212(JIS 補助漢字)が規定されました.漢字 5801 字,非漢字 266 文字が含まれています.
しかし,この補助漢字は日本語 EUC・JIS コード系統の符号化方式では利用できますが,シフト JIS 系統の符号化ではスペースが足りず,利用できません.これと,JIS X 0213 の登場により,JIS 補助漢字は普及しないままに終わりそうです.

JIS 拡張漢字

JIS X 0213 は,最初に 2000年(JIS2000)に制定された,JIS X 0208(JIS 基本漢字)に加えて新たに 4344 字が追加した文字コードです.その後,2004 年の改正(JIS2004)で 10 字が追加され,計 11233 字となっています.以下のような構造になっています.

  • 94×94 では収まらなくなったので,94×94 の領域をもう一つ増やしている.元からあった 94×94 の部分を第 1 面,新たに追加された方を第 2 面といいます.
  • 第 1 面の空き領域に非漢字と,第3水準と呼ばれる漢字達を追加しています.
  • 第 2 面に,第4水準の漢字が追加されました.JIS X 0212 と混乱が起きないようにするため,JIS X 0212 で使われていない区の位置に漢字を割り当てています.

JIS コード,日本語 EUC,シフト JIS のそれぞれに対し,JIS2004 に対応した亜種が存在しますが,ほとんど従来のものと上位互換です.これらを簡単に下の表にまとめておきます.

JIS2004 の改正

JIS2004 の改正で,それまでの JIS2000 から 168 字の例示字形が変更されました.これは,国語審議会が 2000 年 12 月に答申した「表外漢字字体表」に合わせるための変更です.78JIS から 83JIS の改訂時にいくつかの漢字が略字形(拡張新字体)に変更されましたが,今回の変更は逆にいくつかの略字形を正字体に戻すことも行われています.
一言で言うと,「JIS2004 の字形に対応したフォントでは,この168 字の字形が以前とは異なる」ことになります.hwb7.3 文字コード に載せた字形の違いの例をここでも引用します.
90字形と04字形
この字形変更で問題になるのは,個人や地域名などの固有名詞です.面白いのが,external奈良県葛城市external東京都葛飾区で,両者の正式名称に使われる「葛」の字は異なったものになっています.
Windows では Windows Vista から,Mac では Mac OS X v10.5 から,それぞれこの JIS2004 に対応したフォントが付属しています.また,external独立行政法人情報処理推進機構 (IPA) が公開し無料で利用できる IPA フォント も JIS2004 の字形に対応しています.そのため,JIS2004 の字形はほぼ全ての環境で利用可能となっています.

tips
以下は情報処理学会 情報規格調査会の Web サイトにある文字コード表へのリンクで,全て pdf ファイルです.

externalUpdate Registration 87 Japanese Graphic Character Set for Information Interchange
90JIS/97JIS 規格における,区点と文字との対応表です.
externalJapanese Graphic Character Set for Information Interchange, Plane 1 (Update of ISO-IR 228)
JIS2004 第 1 面の区点と文字との対応表です.
externalJapanese Graphic Character Set for Information Interchange --- Plane 2
JIS2000/JIS2004 第 2 面の区点と文字との対応表です.