5. シフトJISコード 

   5−1  シフトJISコードとは
   5−2  半角ローマ字・半角カタカナ (1バイト文字)
   5−3  全角文字 (2バイト文字)
   5−4  問題点


5−1  シフトJISコードとは

前章に述べたように、JISコード(JIS7)は、制御コードと一緒に使わないと半角文字と全角文字の混在が果たせません。 この問題を解決するために、1980年代に、マイクロソフト社を中心とした私企業が、「制御コードなしで半角文字と全角文字の混在が果たせる」よう、 JISコードを規則的に変換(シフト=移動)させたコード体系を作り出しました。 これがシフトJISコード体系です。
MS-DOS、 Windows、MacOS といったパソコンOSの日本語版の内部処理で用いられたため、 Windows の爆発的普及にともなって日本語処理についての事実上の世界標準となり、 最終的には JIS X 0208:1997 でJIS規格に追認されるまでになりました。


5−2  半角ローマ字・半角カタカナ (1バイト文字)

一部のネットワークでは7ビットまでの符号(値にすると 0x00 〜 0x7F )しか扱えません。 そのため、JISコードにはJIS7規格が作られたわけですが、 シフトJISはもともとOSの内部処理用に作られた規格ですから、そんなことは無視して、 符号の8ビット目もコードの識別用に活用します。 半角カタカナにはJIS8が採用され、晴れて 0xA1 〜 0xDF へと割り当てられました。


◆ シフトJISにおける半角ローマ字・半角カタカナ ◆

 |+0 1 2 3 4 5 6 7 8 9 A B C D E F (下位)
 00| ←   制御コード
 10|       JIS X 0211   →
 20|SP ! " # $ % & ' ( ) * + , - . /
 30| 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
 40| @ A B C D E F G H I J K L M N O
 50| P Q R S T U V W X Y Z [ \ ] ^ _
 60| ` a b c d e f g h i j k l m n o
 70| p q r s t u v w x y z { | } ¯ DL
 80| ← 2バイト文字の第1バイト用領域
 90| ←     〃
 A0|   。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ
 B0| ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ
 C0| タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ
 D0| ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ン ゙ ゚
 E0| ← 2バイト文字の第1バイト用領域
 F0| ←     〃
(上位)
※ 半角カナは、UNIX系端末では表示されないかも知れません。

例えば、"2ネンAグミ" (←すべて半角文字)という文字列を画面上に表示または印刷するには、 以下のような文字コードの列(バイト列)となります。

◆JISコード7ビット符号 (11バイト必要) ◆
文字
2 SO SI A SO SI
コード
0x320x0E0x480x5D0x0F0x410x0E0x380x5E0x500x0F
切替
1面裏へ2面2面表へ1面裏へ2面2面2面表へ
  ※SI、SOでなく、ISO-2022-JP のエスケープシークエンスによる切り替えだと19バイト必要。

◆シフトJISコード (7バイトでOK) ◆
文字
2 A
コード
0x320xC80xDD0x410xB80xDE0xD0


5−3  全角文字 (2バイト文字)

JIS7の2バイト文字は、第1バイト・第2バイトともに 0x21 〜 0x7E の範囲の値のみを用います。 半角英数字と値が重なるため、区別のためには漢字制御コードが不可欠でした。
シフトJISでは、2バイトコードの第1バイトを 0x81 〜 0x9F、少し飛んで 0xE0 〜 0xFC の領域に「シフト」させることによって、 「0x81 〜 0x9F または 0xE0 〜(0x7Fを抜かして)〜 0xFC が来たら、次の1バイトと合わせて2バイト文字とみなす」 という判別ができる仕組みにしました。 (前節の図表のピンク色の所を参照して下さい。)
シフトJISの2バイト文字領域は、
(第1バイト 16×3+13)×(第2バイト 16×11-1+13)≒11,000字
ということになります。この数字は、機種依存文字・外字の領域を含みます。 JIS第1水準+第2水準約 7,000字はすっぽり納まりました。 しかしながら、JIS補助漢字や第3・第4水準は納まりようがありません。
漢字制御コードを挟まなくてよい分、扱うデータ量はそれ以前のJIS符号に比べ激減しました。

下は "1B" ("1"と"B"は半角) を画面表示/印刷させるための文字列です。(数字は16進数)

◆JISコード ( 18バイト必要 ) ◆
文字
1 漢字イン 漢字アウト B 漢字イン 漢字アウト
コード
31 1B2442 472F 1B284A 42 1B2442 4148 1B284A
◆シフトJISコード ( 6バイト ) ◆

文字
1 B
コード
0x31 0x940x4E0x420x910x67

 ◆ シフトJISの全角文字 ◆

 \|+012356789ABCDEF
    |
8140| SP、。,.・:;?!\゜´`¨^ ↓↓↓第1水準↓↓↓
8150|  ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\
 :  |
8240|                0
8250| 123456789
8260| ABCDEFGHIJKLMNOP
 :  |
82A0| あぃいぅうぇえぉおかがきぎくぐけ
82B0| げこごさざしじすずせぜそぞただち
 :  |
8890|                亜
88A0| 唖娃阿哀挨姶逢葵茜穐悪握渥旭葦
88B0| 芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷
 :  |
 :  |
9890|                弌 ↓↓↓第2水準↓↓↓
98A0| 丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍
98A0| 于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭
 :  |

'愛' という字のシフトJISコードは 0x88A4 です。


5−4  問題点

シフトJISは、半角英数・半角カナ・全角文字を混在させてもデータ量(バイト数)と表示桁数が常に一致するので、 内部処理を非常にシンプルな作りにできます。
反面、バイトデータの8ビットめを文字識別用に使ってしまったので、インターネットの世界ではそのまま使えず、 ネットワークt通信関係の処理では7ビット符号に変換(エンコード)する必要があります。

第2バイトもシフトさせている範囲( 0x40 〜 0xFC )が、半角英数字と一部重なります。 このことが、データの互換性に関して不具合をもたらす可能性を含んでいます。
例えば、シフトJISコードで2バイトめが'\'と同じコード(0x5C)になる文字を含む文章を、 シフトJISではない文字コード体系のシステムで読み込んだ時、文字化けを起こすことがあります。