Shift_JIS (シフトジス)は、コンピュータ 上で日本語 を含む文字列 を表現するために用いられる文字コード の一つ。シフトJIS (シフトジス)と表記されることもある[ 1] 。
かつてはベンダー による独自拡張を含む文字コード群を指した曖昧な名称であったが、1997年にJIS X 0208 で標準化された。
構造
JIS X 0201 を1バイトで、JIS X 0208 を2バイト で符号化する可変幅文字符号化方式。2バイト文字は、第1バイトに8116 -9F16 またはE016 -EF16 の47通り、第2バイトに4016 -7E16 または8016 -FC16 の188通りを用いる。
第1バイト
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
␀
␁
␂
␃
␄
␅
␆
␇
␈
␉
␊
␋
␌
␍
␎
␏
1
␐
␑
␒
␓
␔
␕
␖
␗
␘
␙
␚
␛
␜
␝
␞
␟
2
␠
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
3
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
4
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
5
P
Q
R
S
T
U
V
W
X
Y
Z
[
¥
]
^
_
6
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
7
p
q
r
s
t
u
v
w
x
y
z
{
|
}
‾
␡
8
9
A
。
「
」
、
・
ヲ
ァ
ィ
ゥ
ェ
ォ
ャ
ュ
ョ
ッ
B
ー
ア
イ
ウ
エ
オ
カ
キ
ク
ケ
コ
サ
シ
ス
セ
ソ
C
タ
チ
ツ
テ
ト
ナ
ニ
ヌ
ネ
ノ
ハ
ヒ
フ
ヘ
ホ
マ
D
ミ
ム
メ
モ
ヤ
ユ
ヨ
ラ
リ
ル
レ
ロ
ワ
ン
゙
゚
E
F
第2バイト
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
ASCII制御文字
ASCIIと同一の文字
ASCIIと異なる文字
半角カナ
2バイト文字の第1バイト
未使用
2バイト文字の第2バイト(JIS X 0208の区番号が奇数の場合)
2バイト文字の第2バイト(JIS X 0208の区番号が偶数の場合)
未使用
さらに、JIS X 0213 に拡張したShift_JIS-2004 では、第1バイトの未使用 領域であるF016 -FC16 を利用している。
第1バイト
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
␀
␁
␂
␃
␄
␅
␆
␇
␈
␉
␊
␋
␌
␍
␎
␏
1
␐
␑
␒
␓
␔
␕
␖
␗
␘
␙
␚
␛
␜
␝
␞
␟
2
␠
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
3
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
4
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
5
P
Q
R
S
T
U
V
W
X
Y
Z
[
¥
]
^
_
6
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
7
p
q
r
s
t
u
v
w
x
y
z
{
|
}
‾
␡
8
9
A
。
「
」
、
・
ヲ
ァ
ィ
ゥ
ェ
ォ
ャ
ュ
ョ
ッ
B
ー
ア
イ
ウ
エ
オ
カ
キ
ク
ケ
コ
サ
シ
ス
セ
ソ
C
タ
チ
ツ
テ
ト
ナ
ニ
ヌ
ネ
ノ
ハ
ヒ
フ
ヘ
ホ
マ
D
ミ
ム
メ
モ
ヤ
ユ
ヨ
ラ
リ
ル
レ
ロ
ワ
ン
゙
゚
E
F
第2バイト
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
ASCII制御文字
ASCIIと同一の文字
ASCIIと異なる文字
半角カナ
2バイト文字の第1バイト
2バイト文字の第2バイト(区番号が奇数の場合)
2バイト文字の第2バイト(区番号が偶数の場合)
未使用
歴史
Shift_JISの誕生
1980年代 、パソコン 用16ビット CPU の普及もあいまって、漢字 やひらがな ・カタカナ を表示可能なハードウェア を備えた情報機器が続々と発売された。これらの製品では、日本語を表現できる文字符号化方式 が模索されており、先行してJIS C 6220(現在のJIS X 0201 )の8ビット 符号(以下「英数字 ・半角カナ 」)と、JIS C 6226(現在のJIS X 0208 、以下「漢字」)がよく利用されていた。この両文字集合の混在にあたっては、ISO 2022 によるエスケープシーケンス で文字集合 を切り替える設計となっていた。
Shift_JISの設計では、ファイルサイズ節約や処理時間短縮を図るため、これら文字集合をエスケープシーケンスなしで混在可能にすることを企図した。 ISO 2022では、英数字・半角カナ・漢字はそれぞれ、8ビット符号空間の中のGL(2116 -7E16 )・GR(A116 -FE16 )のいずれか1領域を使うことで表現する。このうち英数字・漢字だけの混在であれば英数字をGL、漢字をGRに割り当てることもできる[ 2] が、既にGLに英数字、GRに半角カナを割り当てた実装が普及しており、既存のGL・GR領域に漢字を混在させることは困難だった。
1982年 、漢字の符号位置 をこれら符号空間の隙間に押し込む形でShift_JISが実装された。これを実現するためには、漢字の1バイト目として、ISO 2022において不使用のCR(8016 -9F16 )領域に加え、半角カナに割り当てられていたGR領域に約3分の1残されていた未使用領域から捻出することとした。さらに2バイト目には、ISO 2022とは異なり、英数字・半角カナに使用済みの領域をも含む、GL、CR、GRにあたる各領域のほぼ全てを使う必要があった。ただし、GL領域においては、JIS X 0201の記号に当たる部分は極力避けた。
マイクロソフト 日本法人元会長の古川享 によると、Shift_JISの制定にはアスキー 、マイクロソフト(米)、三菱電機 、マイクロソフトウェア・アソシエイツ 、デジタルリサーチ (米)が関わり、特にアスキーの山下良蔵 が中心となって行われたという[ 3] 。これに対する異説として、京都大学 助教授の安岡孝一 は、マイクロソフトウェア・アソシエイツと三菱電機のみの共同開発だと主張していたが[ 4] 、山下本人の発言[ 5] により安岡は自説を撤回する発言をしている[ 6] 。また古くはLife with UNIX の訳書 (ISBN 4-7561-0783-4 ) の「UNIX人名事典」翻訳版加筆部分 (p.45) で、深瀬弘恭 に「MS漢字コードの作者の一人」という紹介文が書かれていた。
初期の実装
Shift_JISはマイクロソフトのMS-DOS に「MS漢字コード」(および後のMicrosoftコードページ932 )、デジタルリサーチのCP/M-86 に「SJC-26」として採用された。両者はほぼ同じだが、全角スペース の扱いに違いがある。全角スペースにMS-DOSは814016 を割り当てているが、CP/M-86は半角スペース2文字分と同等の202016 を割り当てている。CP/M-86での実装は文字列からスペースを探索する処理が簡単になるというプログラミング 上の利点があった。一方、MS-DOSは全角スペースに別のコードを割り当てることで、半角入力モードでスペースキー が2回押されたのか、全角入力モードでスペースキーが1回だけ押されたのかをプログラムが判別できるようにした。これは当時のアプリケーションソフト(Multiplan など)でメニュー選択にスペースキーを使用していたためであった。また、プリンター では全角スペースと半角スペースの幅の比が2対1でない場合があるため、スペースの区別は帳票 設計に影響があった[ 7] 。
標準化
Shift_JISは ISO 2022の符号化の範囲外にあるベンダー独自の実装として誕生しており、普及後もしばらく標準化されずにいたが、JIS X 0208:1997において附属書1で「シフト符号化表現」という名前で仕様が定義された。また、IANA においても「Shift_JIS」の名称が登録されている[ 8] 。
JIS X 0208の拡張規格であるJIS X 0213では、2000年 制定時に附属書1で上位互換仕様のShift_JISX0213 が定められ、2004年 改定時にShift_JIS-2004 と名称が変更された。
その後は更新は停止したが、日本語版Windowsが長らく標準をShift_JISに定めていたことで使用され続けた。不都合が多いためUnicode への移行が呼びかけられている[ 9] 。
符号化方式
区点番号の割当
JIS X 0208 では文字集合が区点番号 として94×94の文字表の行と列の番号の組で表現される。これら区点番号をShift_JISでは以下のような対応で符号化している。
表: 区点(第1面)とShift_JIS符号化
Shift_JIS
第2バイト(16進)
40
…
7E
80
…
9F
…
FC
第1バイト (16進)
81
1区1点
1区63点
1区64点
2区1点
2区94点
⋮
9F
61区1点
61区63点
61区64点
62区1点
62区94点
E0
63区1点
63区63点
63区64点
64区1点
64区94点
⋮
EF
93区1点
93区63点
93区64点
94区1点
94区94点
JIS X 0213 では94×94の文字表が2つあり、それぞれ第1面・第2面と表現される。第1面(第1・2・3水準)は上記符号化の範囲に収まる。第2面(第4水準)は区番号が1・3・4・5・8・12-15・78-94区と不連続に構成されており、この26区分を収録するためにShift_JIS-2004では以下のように対応している。
表: 区点(第2面)とShift_JIS符号化
Shift_JIS
第2バイト(16進)
40
…
7E
80
…
9F
…
FC
第1バイト (16進)
F0
1区1点
1区63点
1区64点
8区1点
8区94点
F1
3区1点
3区63点
3区64点
4区1点
4区94点
F2
5区1点
5区63点
5区64点
12区1点
12区94点
F3
13区1点
13区63点
13区64点
14区1点
14区94点
F4
15区1点
15区63点
15区64点
78区1点
78区94点
F5
79区1点
79区63点
79区64点
80区1点
80区94点
⋮
FC
93区1点
93区63点
93区64点
94区1点
94区94点
区点番号からの変換
面区点番号
m
,
k
,
t
{\displaystyle m,k,t}
から Shift_JISの 第1バイト
s
1
{\displaystyle s_{1}}
・第2バイト
s
2
{\displaystyle s_{2}}
は以下の式で求められる[ 10] 。
⌊
x
⌋
{\displaystyle \lfloor x\rfloor }
は床関数 。
s
1
=
{
⌊
k
+
257
2
⌋
if
m
=
1
and
1
≤
k
≤
62
⌊
k
+
385
2
⌋
if
m
=
1
and
63
≤
k
≤
94
⌊
k
+
479
2
⌋
−
⌊
k
8
⌋
×
3
if
m
=
2
and
k
=
1
,
3
,
4
,
5
,
8
,
12
,
13
,
14
,
15
⌊
k
+
411
2
⌋
if
m
=
2
and
78
≤
k
≤
94
{\displaystyle s_{1}={\begin{cases}\left\lfloor {\frac {k+257}{2}}\right\rfloor &{\mbox{if }}m=1{\mbox{ and }}1\leq k\leq 62\\\left\lfloor {\frac {k+385}{2}}\right\rfloor &{\mbox{if }}m=1{\mbox{ and }}63\leq k\leq 94\\\left\lfloor {\frac {k+479}{2}}\right\rfloor -\left\lfloor {\frac {k}{8}}\right\rfloor \times 3&{\mbox{if }}m=2{\mbox{ and }}k=1,3,4,5,8,12,13,14,15\\\left\lfloor {\frac {k+411}{2}}\right\rfloor &{\mbox{if }}m=2{\mbox{ and }}78\leq k\leq 94\end{cases}}}
s
2
=
{
t
+
63
if
k
is odd and
1
≤
t
≤
63
t
+
64
if
k
is odd and
64
≤
t
≤
94
t
+
158
if
k
is even
{\displaystyle s_{2}={\begin{cases}t+63&{\mbox{if }}k{\mbox{ is odd and }}1\leq t\leq 63\\t+64&{\mbox{if }}k{\mbox{ is odd and }}64\leq t\leq 94\\t+158&{\mbox{if }}k{\mbox{ is even }}\end{cases}}}
符号化可能な文字数
初期のShift_JISでは、第1バイトが47通り、第2バイトが188通りの符号があるため、 47 × 188 = 94 × 94 = 8836 の2バイト文字を表現することができ、これはJIS X 0208で規定された区点番号のすべてを収められるように設計されている。ここに158字の英数字・半角カナ(スペース含む、DEL除く)を加えると、計 8994 文字となる。
さらに、第1バイトはF016 -FC16 を用いることで60通りまで拡張されており、 60 × 188 + 158 = 11438 文字を表現することができる。Microsoftコードページ932 のIBM拡張文字 やShift_JIS-2004の第4水準文字の符号化ではこれらの領域を動員している。
特徴
利点
全角文字と、JIS X 0201で定義したいわゆる半角カナ文字を同一のコード体系で表現できる。
日本語環境においては、MS-DOSで日本語用文字コードとして採用されて以来、パソコンにおいて圧倒的な普及度があり、その他の文字符号化方式に比べてデータ交換可能性が高い。
UTF-8 などに比べてサイズが小さい。UTF-8では半角カナや漢字の多くは3バイトを要する。
欠点
半角カナのための領域を確保した関係上、区点番号と符号の相互演算には前述のように煩雑な条件分岐が必要である。
2バイト目に8016 未満(ASCII のコード領域)が現れる。このため、文字の区切りの判定に手間がかかる。ファイルや電文の先頭から文字コードの判定をする場合はよいが、後ろから判定をしようとすると、最悪の場合、先頭までたどらないといけないことがあるため、プログラムの作り方に工夫が必要になる。また、この領域に含まれる一部の文字の扱いのため、マルチバイトのEUC-JP、UTF-8 などに比べ、プログラミング上の扱いが難しい(次項 を参照)。
JIS補助漢字 が表現できない。
文字集合については実装ベンダがJIS X 0208で規定されていない機種依存の拡張を施していることが多く、こういった拡張部分に関してはデータ交換可能性が低い。特に広く普及しているMicrosoftコードページ932 はJIS X 0213 で拡張されたShift_JIS-2004 と併用できない。
2バイト目が5C等になりうることによる問題
表: JIS X 0208で2バイト目に5C16 を持つ文字一覧
文字
符号 (16進)
読み・字義
文字化け例
―
815C
ダッシュ
ソ
835C
そ (片仮名 )
ソフト→ャtト
Ы
845C
ゥイ (キリル文字 )
噂
895C
ソン、うわさ
噂 話→汚b
浬
8A5C
リ、かいり 、ノット
欺
8B5C
ギ、あざむ-く
詐欺 師→詐去t
圭
8C5C
ケイ
錦織圭 など→錦織撃ネど
構
8D5C
コウ、かま-える
構 成→告ャ
蚕
8E5C
サン、かいこ
養蚕 業→養視ニ
十
8F5C
ジュウ、とお (漢数字 の10)
十 人十 色→署l署F
申
905C
シン、もう-す、さる
申 請→瑞ソ、 申 込み→錐桙ン
曾
915C
ソ、ひ (「曽」の旧字)
曾 孫→荘キ、 曾 祖父→荘c父
箪
925C
タン (「簞」の簡易慣用字体 )
箪 笥→註y
貼
935C
チョウ、は-る
貼 り付け→唐阨tけ
能
945C
ノウ、よ-く、あた-う
能 力→迫ヘ、 可能 性→可柏ォ
表
955C
ヒョウ、おもて、あらわ-す
表 示→侮ヲ、 代表 的→代蕪I
暴
965C
ボウ、バク、あば-れる
暴 力→沫ヘ、 暴 露→迄I
予
975C
ヨ、あらかじ-め、かね-て
予 算→落Z、 予 想→卵z
禄
985C
ロク
元禄 X年→元蝋年
兔
995C
ト、うさぎ (「兎」の異体字)
喀
9A5C
カク、キャク、は-く
喀 血する→嚮撃キる
媾
9B5C
コウ
媾 和→尨a (「講和」の非書換え )
彌
9C5C
ミ、ビ、や (「弥」の旧字)
和泉元彌 など→和泉元怩ネど
拿
9D5C
ダ
拿 捕する→摯゚する
杤
9E5C
とち (「栃 」の異体字)
歃
9F5C
ソウ、ショウ、すす-る
血を歃 って→血を氓チて
濬
E05C
シュン、さら-う
長谷川濬 など→長谷川烽ネど
畚
E15C
ホン、ふご、もっこ
畚 に乗る→痰ノ乗る
秉
E25C
ヘイ、ヒン、と-る
秉 燭→竦C
綵
E35C
サイ、あや
動植綵絵 →動植繩G
臀
E45C
デン、しり
臀 部など→苺狽ネど
藹
E55C
アイ
和気藹 々→和気蛛X
觸
E65C
ショク (「触 」の旧字)
軆
E75C
タイ (「体 」の異体字)
鐔
E85C
タン、つば
金鐔 焼き→金闖トき
饅
E95C
マン
饅 頭→體ェ
鷭
EA5C
バン (鳥の名)
鷭 の群れ→黷フ群れ
Shift_JISでは、カタカナの「ソ」、漢字の「噂」など一部の文字[ 11] の2バイト目に、5C16 を使用している。この符号はJIS X 0201 では円記号 、ASCIIなどではバックスラッシュ に該当し、多くのプログラミング言語(C 、Perl 、Bourne Shell など多数)ではエスケープ文字 と扱う。したがって、ソースコードや文字データの処理においてShift_JISを想定していないプログラミング環境では問題が起こる。この問題は、同じように2バイト目の範囲に5C16 を含むBig5 や、まれではあるがGBK などの文字コード でも発生しうる。
また、5C16 以外についても類似の問題が発生することがある。
2バイト目が7C16 になる文字(「ポ」「芸」など)。この符号はASCIIでは|
(バーティカルバー )に該当する。Unix やMS-DOSなどのシェル 上でこの符号はパイプ記号 と認識され、これらの文字を含むファイルは正常に操作できない。
2バイト目が5B16 (「ゼ」「深」など)、5D16 (「ゾ」「転」など)になる文字。これらの符号はASCIIでは[
, ]
に該当する。そのためこれらの文字は正規表現 と組み合わせて使うことができない。
このようなASCII約物 と同じ符号を含むためにプログラム上で不具合を起こしうるマルチバイト文字を俗に「だめ文字」あるいは「ダメ文字」と呼ぶ[ 12] 。
この問題を回避する伝統的な方法として、以下のようなものがある。
ソースコード全体をEUC-JP やUTF-8 などのGL領域と混用のない符号に変換し、実行またはコンパイルする(例:Perl のencodingプラグマ)。
5Cを含む文字列を扱う場合、「ソ
」→「ソ\
」のようにダメ文字の直後にエスケープ文字を挿入することで目的の符号列として認識させる(例:Perl のSjisソフトウェア[ 13] やJavaScript )。
文字または文字列として扱わず対象文字および内部表現形式を数値の配列として変換を行い、取り扱う際に文字に復号して扱う(例:PerlのEncodeモジュール[ 14] )。
文字化け例
マルチバイト非対応環境では、Shift_JISの「構わない」という文字列は「高墲ネい」[ 15] または「高筲ネい」[ 16] に文字化けすることがある。後の文字の2バイト目が半角カナ 「ネ」として認識されるため、「い」でデコードが再同期され、後の文字列は正常に表示される。
構
わ
な
い
8d
5c
82
ed
82
c8
82
a2
▼エスケープ文字にあたる5c が抜けた場合
8d
82
ed
82
c8
82
a2
高
墲[ 15]
ネ
い
また、同様に「芸能界」という文字列は「芸矧E」に文字化けする。
芸
能
界
8c
7c
94
5c
8A
45
▼エスケープ文字にあたる5c が抜けた場合
8C
7c
94
8A
45
芸
矧
E
名称
「シフト」について
Shift_JISの「シフト」とは、JIS X 0208の文字集合を分割したうえで8ビット符号空間内に“ずらして配置”して符号化していることを意味する。
他の符号化方式においても、複数の文字集合をシフトコード で切り替える操作を「シフト」と呼ぶが、これとは異なる。例えば、ISO-2022-JP はエスケープシーケンス で漢字と英数字を切り替えることを、EUC-JP は補助漢字 と半角カナをシングルシフトで切り替えることを指す。
また、ビット演算 の「ビットシフト 」とも関係がない。
別名
「MS_Kanji 」は、IANAによりShift_JISの別名として割り当てられている[ 8] 。
「x-sjis 」は、IANAに「Shift_JIS」が登録される以前にNetscape Navigator 2.0において使っていたエンコーディング の指定子名である。HTML ドキュメントの「charset」の指定にShift_JISの別名として使えるブラウザエンジン がある。
脚注
関連項目
日本語 用の 文字コード
日本語を含む 多言語文字集合
日本語以外用の 文字集合
ソフトウェア 区分け 概念 関連トピック
カテゴリ