JIS (日本産業規格)

日本の産業製品に関する国家規格。文字コードの分野では JIS X 0208 (基本日本語文字集合) や JIS X 0213 (拡張文字集合) が、日本語テキスト処理の基盤となっている。

JIS (Japanese Industrial Standards、日本産業規格) は、日本の産業標準化法に基づいて制定される国家規格です。2019 年の法改正で「日本工業規格」から「日本産業規格」に名称が変わりましたが、略称の JIS はそのまま使われています。文字コードの分野では、JIS が定めた文字集合と符号化方式が日本語コンピューティングの基盤を形成してきました。

日本語の文字コードに関する主要な JIS 規格は次の 3 つです。JIS X 0201 (1969 年制定、旧称 JIS C 6220) は、ラテン文字と片仮名を定義した最も古い文字コード規格です。ラテン文字部は ASCII とほぼ同じですが、0x5C にバックスラッシュではなく円記号、0x7E にチルダではなくオーバーラインを割り当てており、これが「\ と ¥ が入れ替わって見える」混乱の出発点になっています。JIS X 0208 は 1978 年に JIS C 6226 として制定され (当初の収録は 6,802 文字)、1987 年に現在の規格番号へ変更、1990 年の改正以降は 6,879 文字を収録しています。JIS X 0213 (2000 年制定、2004 年改正) は JIS X 0208 を拡張し、第三水準 1,259 字 (2000 年制定時は 1,249 字、2004 年改正で 10 字追加)・第四水準 2,436 字などを加えて、現行では 11,233 文字を収録します。このほかに JIS X 0212 (補助漢字、1990 年) もありますが、Shift_JIS では表現できないため広くは使われませんでした。

JIS X 0208 の漢字は「第一水準」(16 区から 47 区、2,965 字) と「第二水準」(48 区から 84 区、3,390 字) に分類されます。第一水準は使用頻度の高い漢字で、読みの五十音順に配列されています。第二水準は部首画数順で、人名用漢字や専門用語に使われる漢字が含まれます。区点位置が水準ごとに連続しているため、符号化したときも境目がはっきり出ます。EUC-JP なら第一水準の先頭「亜」が 0xB0 0xA1、第二水準の先頭「弌」が 0xD0 0xA1 で、Shift_JIS ではそれぞれ 0x88 0x9F と 0x98 0x9F です。文字化けしたバイト列を読むとき、この目安があると当たりを付けやすくなります。

JIS 規格の文字集合を実際にコンピュータで使うには、符号化方式が必要です。同じ JIS X 0208 の文字集合に対して、ISO-2022-JP (7 ビット、電子メール用)、Shift_JIS (1982 年ごろにパソコン向けとして考案され、Windows 日本語版で標準採用)、EUC-JP (UNIX 系で普及) という 3 つの符号化方式が生まれました。この「一つの文字集合に複数の符号化方式」という構造が、日本語の文字化けが起きやすい根本の理由です。さらに Shift_JIS は実装ごとの拡張があり、Windows の CP932 は独自の追加文字を持ちます。波ダッシュ (U+301C) と全角チルダ (U+FF5E) はどちらも CP932 の同じ 2 バイト (0x81 0x60) に対応するため、往復変換で片方に寄ってしまいます。「Shift_JIS で保存した」だけでは情報が足りず、どの実装かまで確認する必要があります。

現在、新規開発で JIS 系のエンコーディングを選択する場面はほぼありません。Unicode (UTF-8) が事実上の標準となり、JIS X 0208 の文字はすべて Unicode に包含されています。しかし、行政システム、金融機関の基幹系、EDI (電子データ交換) など、レガシーシステムでは依然として Shift_JIS や ISO-2022-JP が使われており、文字コード変換の知識は実務上不可欠です。

文字数カウントとの関連では、JIS X 0208 の漢字は Shift_JIS と EUC-JP で 2 バイト、UTF-8 で 3 バイトになります。ただし非漢字は一様ではなく、ギリシャ文字やキリル文字、± や × のような記号は UTF-8 でも 2 バイトです。補助漢字 (JIS X 0212) は EUC-JP で 3 バイトを使い、Shift_JIS には収まりません。同じ「1 文字」でもエンコーディングによってバイト数が異なるため、バイト数ベースの文字数制限 (データベースの VARCHAR など) では、どのエンコーディングを前提としているかを確認する必要があります。

この記事を共有