文字符号化方式

encodingの話。@ITの記事はわかりやすくてよかった。
http://www.atmarkit.co.jp/fjava/rensai3/eclipsejava2_06/eclipse2_06_1.html


この記事読んでたら他のencodingもちょっと見てみたくなったので簡単なプログラムを作成。

private static NumberFormat nf = new DecimalFormat("000");
	
public static void main(String[] args) throws UnsupportedEncodingException {

	List<String> encodingList = new ArrayList<String>();
	encodingList.add("US-ASCII");
	encodingList.add("8859_1");
	encodingList.add("Windows-31J");
	encodingList.add("UTF-8");
	encodingList.add("ISO-2022-JP");

	printBytes("A", encodingList);
	System.out.println("-----------------------");
	printBytes("あ", encodingList);

}

private static void printBytes(String string, List<String> encodingList)
		throws UnsupportedEncodingException {

	for (String encoding : encodingList) {
		System.out.printf("%s : \t", encoding);
		byte[] bytes = string.getBytes(encoding);
		for (byte b : bytes) {
		         System.out.printf("%s ", nf.format(0x000000FF & b));
		}
	         System.out.println();
	}

}

結果

US-ASCII : 	065 
8859_1 :   	065 
Windows-31J : 	065 
UTF-8 : 	         065 
ISO-2022-JP : 	065 
-----------------------
US-ASCII : 	063 
8859_1 :  	063 
Windows-31J : 	130 160 
UTF-8 :   	227 129 130 
ISO-2022-JP : 	027 036 066 036 034 027 040 066 

「A」は全部同じバイト列だけど、「あ」はそれぞれで異なることが一目瞭然(「US-ASCII」と「8859_1」はマッピングできずに「?」をさしているので同じに見える)。
Windows-31Jだと2バイト、UTF-8だと3バイト要しているってのもすぐ分かる。ま、このように符号化方式によって違うからこそ日本語とかの文字は文字化けが起きるんだ、ってな話を新人君にしてあげたのでありました。