Java MS932とShift_JISの違い

Javaで見かけるMS932とShift_JISの違いです。Javaコードで確認します。

目次

サンプル MS932とShift_JISの違い
  バイト配列にするgetBytesメソッドで確認
  getBytesメソッドでUTF8を指定した場合

MS932とShift_JISの違い

  • MS932は、Shift_JISを拡張した文字コードです。①や㍉や㈱などのNEC特殊文字と髙(はしごだか)などのIBM拡張文字を含みます。(+NEC選定IBM拡張文字)
  • Windows-31JはMS932の別名で同じです。(CP932も同じ。マイクロソフトのドキュメント等でCP932という用語が使われている)
  • Shift-JISには、NEC特殊文字とIBM拡張文字とNEC選定IBM拡張文字は入っていないので注意が必要です。
  • 以下は、WikipediaのMicrosoftコードページ932のリンクです。
    https://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932

バイト配列にするgetBytesメソッドで確認

文字列をバイト配列にするgetBytesメソッドでShift_JISとMS932とWindows-31Jを指定したサンプルです。

package test1;
import java.io.UnsupportedEncodingException;

public class Test1 {
	public static void main(String[] args) {
		String str1 = "③㈱"; //NEC特殊文字
		
		try {
			byte[] b2 = str1.getBytes("Shift_JIS");
			for (byte s : b2) {
				System.out.println(s); //63 63
			}
			System.out.println(new String(b2,"Shift_JIS")); //??
			
			byte[] b3 = str1.getBytes("MS932");
			for (byte s : b3) {
				System.out.println(s); // -121 66 -121 -118
			}
			System.out.println(new String(b3,"MS932")); //③㈱
			
			byte[] b4 = str1.getBytes("Windows-31J");
			for (byte s : b4) {
				System.out.println(s); // -121 66 -121 -118
			}
			System.out.println(new String(b4,"Windows-31J")); //③㈱
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}

6行目は、NEC特殊文字です。
9行目は、Shift_JISを指定していますが文字のコードがないのでバイト配列の作成と復号ができません。
15,21行目は、MS932とWindows-31Jを指定しています。バイト配列の作成と復号ができています。

バイト配列にするgetBytesメソッドでUTF8を指定した場合

文字列をバイト配列にするgetBytesメソッドでUTF_8を指定したサンプルです。
変換と復号はできます。

package test1;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class Test1 {
	public static void main(String[] args) {
		Charset charset = StandardCharsets.UTF_8;
		String str1 = "③㈱";
		
		byte [] ar1 = str1.getBytes(charset);
		for (byte b1: ar1){
			System.out.println(b1); 
			//-30 -111 -94 -29 -120 -79
		}		
		String str2 = new String(ar1,charset); //UTF-8
		System.out.println(str2); //③㈱
	}
}

関連の記事

UnicodeとUTF-16とUTF-8の違い(秀丸で文字コードを確認)

△上に戻る