文字符号化方式
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バイト要しているってのもすぐ分かる。ま、このように符号化方式によって違うからこそ日本語とかの文字は文字化けが起きるんだ、ってな話を新人君にしてあげたのでありました。