Shift_JIS、CP932、MS932、Windows31-Jはいずれも「文字符号化方式(文字コード)」である。これらはほとんど同じものだが、混乱するので改めて違いを整理してみました。
Shift_JISとCP932の違い
Shift_JISはJIS X 0208で規格化されている「文字集合」を符号化する文字符号化方式の一種です。
一方、CP932はJIS X 0208に①などのいわゆる機種依存文字を追加した、MicrosoftのWindows独自の「文字集合」を符号化するための「文字符号化方式」です。符号化する方法はShift_JISと同じです。
つまり、Shift_JISとCP932は、符号化する「文字集合」自体に違いがあるということです。CP932で使われる文字集合は、Shift_JISで使われる文字集合(JIS X 0208規格)にいくつかの文字を追加したものなので、Shift_JISの文字集合のスーパーセットと考えることができます。
したがって、符号化する方式は同じなので、CP932はShift_JISで符号化されたデータも正しく扱えるでしょう。反対に、CP932で符号化したデータでも、JIS X 0208の範囲の文字しか使っていなければ、Shift_JISでも扱えるということになります。
Shift_JISとCP932の違いで私がよく混乱するのは、エディターの文字コードを選択して保存する機能についてです。Windowsのほとんどのテキストエディターでは、保存する文字符号化方式としてShift_JISを選択できますが、CP932を選択できるものはほとんどありません。
しかし、Shift_JISでは符号化できないはずの①などの文字もShift_JISを選択して普通に保存できてしまいます。これは、Shift_JISとCP932の違いを正しく理解していれば、実際にはCP932を使って符号化してファイルに保存しているだろうということは容易に想像できます。
おそらく多くの人はCP932を知らないので、テキストエディターで厳密にCP932を選択させると、逆にわかりづらくなるため、Shift_JISを選択するようになっているのだと思います。
CP932とWindows-31JとMS932は同じもの
結論から言うとCP932、Windows-31J、MS932は内容的には同じものです。
CP932をIANAにWindows-31Jという名前で登録したので2つの名前ができてしまいました。CP932という名称の方がどちらかというと一般的に使われている気がしますが、Windows-31Jという名称はIANAの登録名なのでHTMLなどで文字コードを指定するときにはIANAに登録されているWindows-31Jを使う必要があります。
またJAVAの世界では、IBMのCP932とWindows-31Jを区別するために、MS932という名前が使われていますので、ますます混乱してしまいます。
まとめ
- CP932、Windows-31J、MS932は同じものを表していますが、コンテキストによって違う名前が使われている(使う必要がある)。
- CP932とShift_JISでは、扱う文字集合が少しだけ違う。
- Windowsのテキストエディターなどは、実際にはCP932で符号化していても、ユーザーの利便性のためShift_JISという名前を使っている。
まとめとしては以上のようになります。
それぞれの違いについていろいろと書きましたが、いまどきは文字符号化方式としてUTF-8が使うのが主流なので、普段は何も考えずにUTF-8を使えばよいと思います。特別な理由がなければそれが一番問題が起きない選択でしょう。