シフトJIS

読み:シフトジス
外語:SJIS: Shift_JIS
品詞:名詞

日本語の文字コードの符号化の方法(CES)の一つ。JIS漢字コード(JIS X 0208)を再配置(シフト)し、2バイト文字と1バイト文字(JIS X 0201)を、エスケープなどで切り替えることなく同時に混在して扱えるようにしたもの。略してSJIS。

シフト符号化表現」とも呼ばれる。

なお、シフトJISはあくまで「符号化の方法」であり、文字集合(CCS)の規定ではないので、これを文字コードと表現することは誤りである。

変換

シフトJISはJIS X 0208の区点コードを計算式に従い変換したもので、JIS X 0201と共存できるよう工夫されたものである。

JIS X 0208文字は2バイトで構成され、1バイト目は8/1〜9/15、14/0〜15/12(60種)、2バイト目は4/0〜7/14、8/0〜15/12(188種)とする。

この巧みなコードの配置(以下、マッピングと呼ぶ)が、シフトJIS最大の特徴であり、当時は紙と鋏で試行錯誤しながら、うまい配置方法を検討したとされる。もって、これが世界初の実用化された日本語符号化法となった。

マッピング

JIS X 0201との併用が求められたシフトJISの1バイト目は、必然的にJIS X 0201のすき間、ということになる。

そして、2バイトめはちょうど2区ぶん(1区は94字)用意したため、1バイト目は区数の半分で間に合うことになる。1バイト目は60個(120区分)用意されたため、このうちの47個(94区分)をJIS X 0208に用い、残りは自由に用いることが可能となった。

JIS X 0208環境の実装では、余分の95〜120区相当部分に外字領域を割り当てたりシステム外字を配置したりしているものが多かった。

JIS X 0213環境の実装では、95〜120区相当部分にJIS X 0213の2面の文字が配置されている。

0x00〜0x7FJIS X 0201英数と同じ。制御コードや文字コードがある
0x80〜0x9FシフトJIS漢字の第1〜第3水準の1バイト目となる
0xA0〜0xDFJIS X 0201カタカナ文字(通称半角カナ)
0xE0〜0xFCシフトJIS漢字の第2・第4水準の1バイト目となる

このようにJISを変換(シフト)したコードであるため、俗に「シフトJIS」と呼ばれるが、元々JIS規格に定められた符号化方法ではない。

但し1997(平成9)年改訂のJIS X 0208:1997から、明確に規格の一つの形態だと規定されるようになった。

実際に、様々な文字集合(CCS)がこのシフトJISという符号化の方法(CES)で符号化され使用されており、又は使用されていた。

例えば、かつてのPC-9801/PC-9821/EPSON PCではJIS X 0208に専用のシステム外字を混ぜた文字集合(CCS)をシフトJISで符号化して用いた。

現在のWindowsも、JIS X 0208に上記のシステム外字の一部を混ぜた文字集合(CCS)をシフトJISで符号化して用いている。これがWindows-31Jである。

また昨今は、JIS X 0213:2000をCCSに用いるShift_JISX0123や、その後継であるJIS X 0213:2004ををCCSに用いるShift_JIS-2004などがある。

これらは互いにCCSが異なっているため非互換だが、CES(符号化)としてはどれもシフトJISと呼ばれる。

「シフトJIS」とは何を指すのか

シフトJISは単なる符号化の方法(CES)なので、元となる文字集合(CCS)に各社が勝手に独自の外字文字を定義したりしており、多様な種類があるのは前述の通りである。

当然それらは互いに互換性が無いのでJIS規格外文字を使用した場合は情報交換出来ないのも前述の通りで、JIS規格文字でも第3水準や第4水準文字を使った場合は旧来のシステムと互換が取れない。それでもこの一定の法則に従って符号化された物はシフトJISと総称されるのも前述の通りである。

しかしこれらは全て「シフトJIS」としか呼ばない上、文字集合(CCS)と符号化方法(CES)を区別せず「文字コード」として扱う者が多かったことから、結果として「シフトJISとはいったい何を指すのか」という問題を生むこととなった。この問題は例えばシフトJIS→Unicode変換のような作業を行なう場合に特に重大な問題として伸し掛かってくることになる。

一応IANAにはShift_JISの名で登録されており、ここで採用されている文字集合(CCS)は純粋なJIS X 0208である。従ってWindows他で日常的に使われているシフトJIS(Windows-31J)は文字集合(CCS)が異なっており、いわゆる文字コードとしては別物であるといえる。

Javaに見る「シフトJIS」の混乱

Java 1.1まで、エンコーディング名SHIFT_JISはCCSにJIS X 0208を用いた純粋なシフトJISだった。

日本の技術者よりWindows-31Jもサポートして欲しいという要求が出さたことが受け入れられてJava 1.1.8とJava 2 SDK 1.2からMS932コンバータを追加、そして日本語Windowsでのデフォルトも変更されることになってしまった。

このため、JavaではWindowsのシフトJISがMS932やSHIFT_JISとして定義され、本来の純粋なJIS X 0208準拠のもの、つまりIANAに正式に登録されている文字集合SHIFT_JISは "SJIS" になってしまったのである。

しかし、XMLなどの推奨MIME名を用いるアプリケーションで、この非互換問題が深刻化してしまった。そこでJava 2 SDK 1.4.1β版より、元どおりにSHIFT_JISはIANAに登録されたとおりのものを指すようになった。Windows環境のシフトJISはMS932あるいはWindows-31Jと表現されることになった。

「シフトJIS」とJIS X 0201問題

シフトJISはJIS X 0201に対する拡張である。JIS X 0201はISO/IEC 646準拠であり、これはUS-ASCIIの変種である。

なお、RFC 2046ではUS-ASCIIの変種をインターネットメールで使用することについて

use in Internet mail is explicitly discouraged (使うべきではない)

としているため、この規定に従うとすると JIS X 0201を用いているシフトJISはインターネットメールで使用すべきではない。

処理系における問題点

シフトJISは2バイト目に\文字(5/12)が含まれているため、ファイル名として使う場合や、Cなどのプログラミング言語のエスケープと間違えられるなど問題を起こしやすい。

また特定のバイトを取り出しても、それが厳密に1バイト目か2バイト目かを判断できないため、日本語を扱うソフトウェアを作る際の厄介な問題となっている。

ちなみに2バイト目に\を含む文字を俗に「だめ文字」と呼ぶ。

仕様の問題点

更にGR領域に関してはISO/IEC 2022の国際規格に準拠しておらず、本来は制御コードが配置されるはずの8/0〜9/15の範囲(C1)にも文字が割り当てられるなどの点で、文字コードにこだわりを持つ者からは嫌われている。

また極めて拡張性に乏しく、大幅な拡張の余地は殆どない。JIS X 0213による拡張が最後と思われる。

Microsoftにより提唱され、MS-DOSやWindows、Macintosh、そして一部のUNIXなどで使われている。

発案

具体的な発案者は、山下良蔵であり、シアトルでこれが作られた。また、Chris Larson(クリス・ラーソン)もこれに助言をしており、都合、この二人でシフトJISが作られた。

この時山下は「MS漢字コード」(MS_Kanji)と命名したが、MSという社名が入っていたことから普及しなかったようだ。

現在呼ばれる「シフトJIS」という呼称は、MSA(マイクロソフトウェア・アソシエイツ)の発案であると、山下により語られている。

誕生まで

1980(昭和55)年、アルプス電気は漢字表示可能なオフコンを開発中であり、これに搭載するBASICをアスキーマイクロソフトに発注していた。このことから、アルプスの開発担当者、阿部高陽も、山下と共にこのシフトJISの初期の開発に、何らかの形で携わっていたと考えられている。

1981(昭和56)年、三菱電機のMULTI-16の開発においてOSにCP/M-86を搭載するにあたり、日本語の対応が求められていた。ここで、本格的に日本語の符号化が動きだす。

山下は当初、今で言うEUCと同様のものを考えていた。アルプス電気での開発の経験から、山下は半角カナのサポートの必要性は薄いと考えたためである。

しかし、三菱電機のMULTI-16の開発にあたり、アスキーマイクロソフトと三菱電機のインターフェイス役だった深瀬弘恭(後のIIJ会長)より、半角カナのサポートは過去の資源を継承する上で重要である、と説得される。山下は深瀬の熱心な説得を受け入れ、半角カナを避けたJIS X 0208のマッピングを検討することとなった。

設計方針決定

やがて、次の方針が決定される。

  1. 既存の英語版ソフトウェアに対する影響を最小限とする。
  2. JISコードとの変換は、可能な限り簡単なアルゴリズムに。
  3. 半角カナと共存する。

英語ソフトウェアと共存のために、制御コードによる切り替えは排除する方針とした。これに伴い、コードにして1/15以下は排除、また7/15も排除した。言語処理系で使う記号も極力避けるため、2バイト目のスタートは4/0(ASCIIで@)とした。

コードの末尾は15/12で、15/13〜15/15は排除した。これは、当時ディジタルリサーチが開発中だったMP/M(CP/Mの後継と予想されたOS)で、タスク間の通信メッセージパケットの識別に15/13以降が使われていたことから、影響を避ける目的で使用が避けられた。しかしMP/Mは結局普及しなかったため、結果としてこれは無駄な遠慮になっている。

コードをシフトしてマッピングする、というアイディア誰が思い付いたのかは今も明らかでないが、山下とも、アルプス電気の阿部とも、あるいは三菱電機とも考えられている。

仕様決定

山下は、一応の案が決定したところで、ビル・ゲイツの承認を得るため彼の部屋で仕様を説明した。ゲイツは、君が良いと言うのならそれで良い、と快諾したという。

結果を日本にFAXするため部屋を出た所で、山下はChris Larsonに会う。Larsonに結果を説明すると、Larsonはこれに改良案を提案した。

当初案はJIS X 0208をそのままマップしていたため、第二バイトの小さい方が第一水準、大きい方が第二水準となっていた。しかし、これではソート時に不便である。Larsonの提案により、現在のShift JISのように、二次元マップ上の上下に第一水準と第二水準の文字が並ぶようになり、よりスマートな仕様となった。

そこで山下はゲイツの部屋にとって返し、Larsonの提案のように仕様を変えたいと申し出ると、君が私が良いと言うのならそれで良い、と同じ返事で快諾したとされる。MS漢字コード、後にシフトJISと呼ばれる符号の仕様が決まった瞬間である。

文字の幅

こうして作られたシフトJISには、利点があった。

当時は表示能力の制限から等幅のフォントしか利用出来ず、もって英数文字は半角、漢字は全角と、文字幅は二段階の変化をする。シフトJISでは、半角文字は英数とカナで、これは常に1バイトだった。そして全角文字である漢字は常に2バイトであり、文字列のバイト数と表示幅が常に一致するのである。

これは偶然ではなく、そのように設計されたのである。

採用そして

このような経緯を経て、マイクロソフトの開発した、MULTI-16用のBASIC(CP/M-86用M-BASIC86)、そして日本語MS-DOS 1.25として採用された。

MS-DOS 1.25ということからも分かるように、当時はまだ、MS-DOSにはディレクトリ機能がなかった。MS-DOSのディレクトリの区切りがUNIXのように/ではなく\となったのは、このシフトJISが作られたなのである(但し、C言語が\をエスケープに使ったのは遥かに前)。

こうして不幸にも、MS-DOSには2バイト目の\文字という問題を抱え込むことになってしまったのである。