"変態"を色々な文字集合で表したものをHexDampしてみる
変態アドベントカレンダー多分21日目ということで記事を書きます。
2週目ということもありネタも無いまま30分で準備できて30分で記事をかけるというもので。
Javaに限らずプログラミング言語では文字集合という概念を使用して文字を扱っています。
違う文字集合の文字は正しく扱えないので、外部とのやり取りを行う場合はどんな文字を使用しているのかきちんと指定して上げる必要があります。
ということで、どんなJavaプラットフォームでも扱えるCharSetと、あとはよく使っているであろうWindows-31J、EUC-JP、ISO-2022-JPについて"変態"という文字列をバイト配列に変換しそのまま出力してみました。
使用したソース。
package megascus.charset; import java.nio.charset.Charset; import sun.misc.HexDumpEncoder; /** * * @author megascus */ public class CharSetMain { public static void main(String[] args) { out("変態", "US-ASCII"); out("変態", "ISO-8859-1"); out("変態", "UTF-8"); out("変態", "UTF-16BE"); out("変態", "UTF-16LE"); out("変態", "UTF-16"); out("変態", "Windows-31J");// Windows out("変態", "EUC-JP"); // Unix out("変態", "ISO-2022-JP"); // メール } private static void out(String str, String charset) { byte[] bs = str.getBytes(Charset.forName(charset)); HexDumpEncoder encoder = new HexDumpEncoder(); System.out.println(charset); System.out.println(encoder.encode(bs)); System.out.println(); } }
結果
US-ASCII 0000: 3F 3F //日本語を扱えないCharSetのため文字化けしている ISO-8859-1 0000: 3F 3F //日本語を扱えないCharSetのため文字化けしている UTF-8 0000: E5 A4 89 E6 85 8B UTF-16BE 0000: 59 09 61 4B UTF-16LE 0000: 09 59 4B 61 UTF-16 0000: FE FF 59 09 61 4B Windows-31J 0000: 95 CF 91 D4 EUC-JP 0000: CA D1 C2 D6 ISO-2022-JP 0000: 1B 24 42 4A 51 42 56 1B 28 42
ということで、目に見える形では同じように見えても、実は内部としては違う形式で持っている可能性もあるので注意して下さいというお話でした。