Shift JIS

Shift_JIS（シフトジス）は、コンピュータ上で日本語を含む文字列を表現するために用いられる文字コードの一つ。かつてはベンダーによる独自拡張を含む文字コード群を指した曖昧な名称であったが、1997年に標準化文書JIS X 0208:1997の附属書1で規定された。「Shift_JIS」はIANAにおける登録名である。
マイクロソフトなどの各ベンダーが実装するShift_JISの亜種については「Microsoftコードページ932」を参照。Mac OSが実装する亜種については「MacJapanese」を参照。

Shift_JISの誕生

1980年代、パソコン用16ビットCPUの普及もあいまって、漢字やひらがな・カタカナを表示可能なハードウェアを備えたパソコンが続々と発売された。そのため、日本語を表現できる文字符号化方式が模索されていた（Shift_JISを「シフトJISコード」と呼んで符号化文字集合（文字コード）の面のみを考える議論があるが、ここでは文字符号化方式の面に焦点を当てる）。
文字符号化方式Shift_JISの設計者らは、先行してよく利用されていたJIS C 6220（現在のJIS X 0201）の8ビット符号（以下「英数字・半角カナ」）と、JIS C 6226（現在のJIS X 0208、以下「漢字」）の両文字集合を表現しようとした。また、ファイルの大きさや処理時間の短縮を図るため、エスケープシーケンスなしで混在可能にすることを企図した。
JIS C 6220とJIS C 6226の2つはともに、ISO 2022で文字集合を切り替えて利用する設計があった。ISO 2022に基づく文字符号化方式では、英数字、半角カナ、漢字はそれぞれ、8ビット符号空間の中のGL/GRという領域の1つを（ただし漢字は2回）使うことで表現できる。もし英数字と漢字の2つをエスケープシーケンスなしで混在したいなら、英数字をGL、漢字をGRに割り当てる方法がある。EUC-JPは、おおよそそのように実装されている。
しかし、パソコンではすでに、JIS X 0201の8ビット符号、つまりGLに英数字、GRに1バイトカタカナ（半角カタカナ）を割り当てた符号が普及していた。英数字と1バイトカタカナの2つを動かすことは、文字化けの原因になるため避ける必要があった。そのため、ISO 2022の枠内の領域に漢字を混在させることは困難だった。
1982年（昭和57年）、漢字の符号位置を複雑に移動（シフト）し、符号空間の隙間に押し込むShift_JISが誕生した。これを実現するためには、漢字の1バイト目として、ISO 2022におけるGR（A1-FE）領域に3分の1残していた未使用領域に加え、ISO 2022において不使用のCR（80-9F）領域を使用することとした。さらに2バイト目には、ISO 2022とは異なり、英数字・半角カナに使用済みの領域をも含む、GL、CR、GRにあたる各領域のほぼ全てを使う必要があった。ただし、GL（21-7E）領域においては、JIS X 0201の記号に当たる部分は極力避けた。
マイクロソフト日本法人元会長の古川享によると、Shift_JISの制定にはアスキー、マイクロソフト（米）、三菱電機、マイクロソフトウェア・アソシエイツ、デジタルリサーチ（米）が関わり、特にアスキーの山下良蔵が中心となって行われたという。これに対する異説として、京都大学助教授の安岡孝一は、マイクロソフトウェア・アソシエイツと三菱電機のみの共同開発だと主張していたが、山下本人の発言により安岡は自説を撤回する発言をしている。また古くはLife with UNIXの訳書 (ISBN 4-7561-0783-4) の「UNIX人名事典」翻訳版加筆部分 (p.45) で、深瀬弘恭に「MS漢字コードの作者の一人」という紹介文が書かれていた。

Shift_JISの実装

Shift_JISはマイクロソフトのMS-DOSに「MS漢字コード」（および後のMicrosoftコードページ932）、デジタルリサーチのCP/M-86に「SJC-26」として採用された。両者はほぼ同じだが、全角スペースの扱いに違いがある。全角スペースにMS-DOSは8140を割り当てているが、CP/M-86は半角スペース2文字分と同等の2020を割り当てている。CP/M-86での実装は文字列からスペースを探索する処理が簡単になるというプログラミング上の利点があった。一方、MS-DOSは全角スペースに別のコードを割り当てることで、半角入力モードでスペースキーが2回押されたのか、全角入力モードでスペースキーが1回だけ押されたのかをプログラムが判別できるようにした。これは当時のアプリケーションソフト（Multiplanなど）でメニュー選択にスペースキーを使用していたためであった。また、プリンターでは全角スペースと半角スペースの幅の比が2対1でない場合があるため、スペースの区別は帳票設計に影響があった。

Shift_JISの標準化

Shift_JISは、符号化文字集合とその文字符号化方式の両方を含む現実の問題を解決するための技術である。それゆえ、JIS X 0208の文字集合を利用してはいるものの、ISO 2022の符号化の方針の範囲の外にある。しかし現在では、JIS X 0208:1997の附属書1に、「シフト符号化表現」という名前で仕様が定義されている。
JIS X 0208の拡張規格であるJIS X 0213では、2000年（平成12年）制定の初版で附属書1としてShift_JISX0213が定められた。2004年（平成16年）改正時の10文字追加に伴って、Shift_JIS-2004と名称が変更された。
IANAでも「Shift_JIS」という名前が割り当てられている。

コード空間における文字数制限

Shift_JISの2バイトコードの空間は、第1バイトが81-9FならびにE0-FC、第2バイトが40-7Eならびに80-FCである。したがって、60×188=11280文字、さらに1バイトコードが158文字（スペースを含み、DELは数えず）であるため、計11438文字となる。
なお、Shift_JIS-2004では、2バイト文字が11233文字、1バイト文字が158文字のため、合計11391文字を使用している。

Shift_JISにおける「シフト」とは

Shift_JISの「シフト」とは、256×256の平面の中で文字を複雑に“ずらす”という意味の「シフト」である。
ISO-2022-JPは指示シーケンスで漢字とアルファベットを切り替える符号化方式である。また、EUC-JPは補助漢字と半角カタカナをシングルシフトで一時的に切り替えて使う符号化方式である。これらの符号化方式で行われている、各文字集合の面をシフトコードによって切り替える操作も「シフト」と呼ばれるが、Shift_JISの「シフト」はこれらとは異なる意味である。またビットをずらす操作（ビットシフト）とも異なる。

Shift_JISと区点番号

Shift_JISが符号化の対象にする文字集合は、JIS X 0208である。この符号化文字集合には、区点番号という概念が存在する。これは、94×94の文字表の行と列の番号の組である。
Shift_JISでは、8140-FCFCというように、JIS X 0208とはまったく違ったコード体系であるが、JIS X 0208を計算により変形したものであるため、区点番号を用いて文字のコードポイントを指し示すことが多い。内容については、JIS X 0208の1-94区と同じである。ただし、機種依存文字では、シフトJISの符号空間から逆成し、94区の下方にあたかも120区までが拡張しているかのように扱うことがある。95区以上は、ISO/IEC 2022に則ったJIS X 0208の構造では存在し得ないので、本来はおかしい。ベンダ独自の非公式な概念である。なお、JIS X 0213の規格の一部であるShift_JISX0213符号化表現においては、第1バイトF0以降を2面の文字に割り当てており、百何区というような存在しない区番号は登場しない。

「x-sjis」と「MS_Kanji」

「x-sjis」と「MS_Kanji」はともに、HTMLドキュメントの「charset」の指定に「Shift_JIS」の別名として使うことが出来る。
「x-sjis」はIANAに「Shift_JIS」という名前を登録する前に、Netscape Navigator 2.0において使っていたエンコーディングの指定子名である。一部のHTML生成ソフトが自動でこの指定子を組み込んで使っている。そのため認識可能なブラウザがあるが、「Shift_JIS」に書き換えることを推奨している。
「MS_Kanji」はIANAにより「Shift_JIS」の別名として割り当てられている。