恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

Shift_JIS、CP932、SJIS

自分が文章を作成する場合はUTF-8を使っていますが、古いファイルや人から渡されるファイルの中にはUTF-8以外のものもあります。

そこで、個人的に紛らわしいと思っている「Shift_JIS、CP932、SJIS」について、違いを少し調べてみました。本来は専門書を当たるべきなのでしょうけれど、仕事で調査しているわけではないのでWikipediaで済ませました。


一般論

まずは、Shift_JISとCP932の違いから。
WikipediaでCP932に関する項目を見ると、

Microsoft コードページ 932は(以下 CP932)、マイクロソフト及び、
MS-DOSのOEMベンダがShift_JISを独自に拡張した文字コードである。
また、同時にCP932は、Shift_JISのWindowsアプリケーションにおける
「実装」を指す用語であるとも言える。

と書かれています。この記述から、CP932はMicrosoft社などがShift_JISを独自拡張したものだと分かります。

Shift_JISよりもCP932の方が扱う文字の範囲が広いので、CP932を使って作成されたファイルをShift_JISに変換したら失われる文字があるかもしれませんね。

次はWindows-31Jに関するWikipediaの記述です。

Windows-31J
Windows 3.1 (J) のリリースに合わせて、マイクロソフトが IBMと日本電気(NEC)
のコードを統合して作った符号化文字集合。1993 年以降、マイクロソフトが
自社のドキュメント等で「CP932」という用語を使って表している対象は、
常にこの「Windows-31J」である。この名前は IANA に登録されている。

この記述を読むと、1993年以降、CP932の中身は「Windows-31J」のようです。

最後にSJISに関するWikipediaの記述

SJIS
Shift_JISの短縮形。

この記述からSJISShift_JISと同じだと分かります。

ここまでをまとめると以下のようになります。

・SJISはShift_JISを短縮した名称
・CP932はShift_JISをMicrosoft社などが独自拡張したもの
・1993年以降のCP932はWindows-31J


現実はもう少し複雑

一般論としては上述したとおりですが、現実はもう少しややこしいようです。

たとえば、エンコーディングに関する実装において「SJIS」というワードを「Windows-31J」に割り当てている場合もあるようです。この状況だと「SJIS = Shift_JIS」ではありませんね。

こういうケースがあるので、何か上手く行かなかった時にその都度どんなセッティングになっているのか調べるしかなさそうです。


素朴な疑問(Vimsjis

いきなりVimの話になりますが、Vimのヘルプでencodingに関する部分を読むと

2   cp932    日本語 (Windows only)
2   euc-jp  日本語 (Unix only)
2   sjis    日本語 (Unix only)

という記述がありました。気になるのは3行目のsjisです。このsjisShift_JISと同一視してよいのか分かりません。はて?