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); //③㈱
}
}
関連の記事