Shift_JIS
[カテゴリ:仕様]
Shift_JIS (シフトJIS、略してSJISとも)は、JIS X 0208をJIS X 0201と一緒に使うための符号化方式です。JIS X 0208の附属書1で定義されています。上位互換の拡張規格としてShift_JIS-2004があります。
符号の構造
JIS X 0201の8ビットコードは、0x7F以下(GL領域)にラテン文字集合(ASCIIと類似、2文字だけ違う)を、0xA0以上(GR領域)に片仮名集合の、ともに1バイトコードを配置しています。しかし片仮名集合は0xE0以降が空いているので、そこと0x80-0x9Fの制御文字領域をも利用して、JIS X 0208の文字を詰め込んでしまったものがShift_JISです。
元々のJIS X 0208の格好ではJIS X 0201の隙間に詰め込むことができないので、計算によって変形しています。
JIS X 0208の区点番号からShift_JISの第1・第2バイトを計算する方法は、下記のShift_JIS-2004の計算式を参照してください。面番号が2の場合を無視するとShift_JISと同じです。
使用上の注意事項
注意点として、2バイト文字の第2バイトの範囲が、1バイト文字であるJIS X 0201ラテン文字と重なる(つまり、0x7F以下の範囲を含む)ことが挙げられます。
特に、メタ文字としてしばしば用いられる0x5C (円記号。ASCIIではバックスラッシュ)もシフトJISの第2バイトになり得ることから、以前より問題を引き起こしてきました。
他のコードとの関係
Shift_JIS-2004
Shift_JISはShift_JIS-2004のサブセットとみなせます。別の言い方をすれば、Shift_JIS-2004をサポートすれば、Shift_JISをサポートしたことにもなります。
Unicode
Shift_JISとUnicodeとの機械可読な変換表は、当サイトの「JIS X 0213のコード対応表」にあります。このページからダウンロードできる「Shift_JIS-2004とUnicodeの対応表」のファイルがそのまま使えます。[2000]及び[2004]と記された行を読み飛ばせば、JIS X 0208ベースのShift_JISにある文字だけに限定されます。
ベンダ定義外字 (CP932, Windows-31J, MS932等)
Shift_JISには各社のベンダ定義外字を空き領域に追加した亜種がありますが(例えばWindowsのCP932ないしWindows-31J)、規格違反の実装でありShift_JIS-2004との互換性がなく(一部の丸付き数字等の非漢字除く)、またJIS X 0208の欠点を補うには量・質ともにあまりにも不十分であり、二重符号化(ひどい場合には三重符号化)の問題さらにはUnicodeとの変換がおかしいという問題を持つものもあるため、使うべきではありません。
問題点とその解決法
Shift_JISにはいくつかの問題があります。
- JIS X 0208をベースにしているため、文字が足りない
- 空き領域にベンダが独自に文字を割り当てたものがあり、相互運用性の問題を生じている(ベンダ定義外字、いわゆる機種依存文字)
- ベンダの実装によっては、Unicodeとの変換において、いくつかの記号がJISの定義と異なる間違った文字に変換するものがある (波ダッシュ問題)
これらの問題は、Shift_JISの上位互換の符号化方式であるShift_JIS-2004を使うことで解決できます。
コード変換の際に、例えばiconvではこう指定します。
iconv -f SHIFT_JIS -t UTF-8 < sjis.txt > utf8.txt
この "SHIFT_JIS" を "SHIFT_JISX0213" に置き換えれば、Shift_JIS-2004が使われ、上記の問題が解決します。
iconv -f SHIFT_JISX0213 -t UTF-8 < sjis.txt > utf8.txt
反対方向、つまりUTF-8からSJISに変換するには、-f と -t を逆にします:
iconv -f UTF-8 -t SHIFT_JISX0213 < utf8.txt > sjis.txt
なお、SHIFT_JISX0213を使うと、Windowsのベンダ定義外字の丸つき数字やローマ数字等の13区の記号類も救済することができます。
関連項目
- Shift_JIS-2004 - 拡張版
- JIS X 0208 - 元になっている規格
- EUC-JP - JIS X 0208の符号化方式の一種
- ISO-2022-JP - JIS X 0208の符号化方式の一種
最終更新時間:2017年05月14日 22時32分42秒