"変態"を色々な文字集合で表したものをHexDampしてみる

変態アドベントカレンダー多分21日目ということで記事を書きます。
2週目ということもありネタも無いまま30分で準備できて30分で記事をかけるというもので。

Javaに限らずプログラミング言語では文字集合という概念を使用して文字を扱っています。
違う文字集合の文字は正しく扱えないので、外部とのやり取りを行う場合はどんな文字を使用しているのかきちんと指定して上げる必要があります。

ということで、どんなJavaプラットフォームでも扱えるCharSetと、あとはよく使っているであろうWindows-31JEUC-JP、ISO-2022-JPについて"変態"という文字列をバイト配列に変換しそのまま出力してみました。

参考:JavaDoc::CharSet

使用したソース。

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 

ということで、目に見える形では同じように見えても、実は内部としては違う形式で持っている可能性もあるので注意して下さいというお話でした。