文字コードを理解するためには、16進ダンプツールを使って、ファイルの内容を見るのが近道だと思います。
そこで、ASHで作成した文字列ツールを使って、文字コードの解析をしてみましょう。
このツールを使って、JISコード、SJISコード、EUCコードのテキストファイルを16進ダンプしてみます。
このページで利用しているツール(getcode, xd)は、以下のページにあるCプログラムをメイクすれば、作成できます。
ASHのプログラムソース
UNIXには、od -x というコマンドで16進ダンプができますが、あまりお勧めできません。
では、サンプルのテキストを作成します。
viで、EUCコードのeuc.datを作成し、nkfでコード変換して作成します。
unix# vi euc.dat AB漢字12 unix# nkf -j euc.dat > jis.dat unix# nkf -s euc.dat > sjis.dat |
作成したら、文字コードをチェックしてみます。
unix# getcode *.dat euc.dat: EUC text jis.dat: JIS text sjis.dat: SJIS text |
各ファイルが、JISコード、SJISコード、EUCコードであることがわかります。
これらのファイルをそのまま16進ダンプしてみます。
unix# xd *.dat euc.dat 00000000: 41 42 b4 c1 bb fa 31 32 0a -- -- -- -- -- -- -- :AB漢字12_ jis.dat 00000000: 41 42 1b 24 42 34 41 3b 7a 1b 28 42 31 32 0a -- :AB@$B4A;z@(B12_ sjis.dat 00000000: 41 42 8a bf 8e 9a 31 32 0a -- -- -- -- -- -- -- :AB@@@@12_ |
EUCコードでは、ちゃんと漢字が表示されますが、JISコードやSJISコードでは、文字化けします。
JISコードの場合、$の付く文字が多く見られます、これは、エスケープシーケンスに0x24が含まれているのと、日本語のひらがなが0x24??という文字コードのためです。
SJISコードの場合は、@の付く文字が多く見られますが、これは、EUCコードとしては不正な文字コードとなる場合が多いからです。xdでは、不正な文字があると、@を表示するような仕様となっています。
そこで、xdのオプションを使ってそれぞれの文字コードで表示してみます。
EUCコードのテキストをEUCモードで16進ダンプ unix# xd -e euc.dat euc.dat 00000000: 41 42 b4 c1 bb fa 31 32 0a -- -- -- -- -- -- -- :AB漢字12_ JISコードのテキストをJISモードで16進ダンプ unix# xd -j jis.dat 00000000: 41 42 1b 24 42 34 41 3b 7a 1b 28 42 31 32 0a -- :AB_ 漢字_ 12_ SJISコードのテキストをSJISモードで16進ダンプ unix# xd -s sjis.dat 00000000: 41 42 8a bf 8e 9a 31 32 0a -- -- -- -- -- -- -- :AB漢字12_ |
こんどは、それぞれのデータが、ちゃんと漢字で表示されます。
getcodeの処理を使えば、文字コードの自動判定は簡単にできるのですが、以下の理由でやっていません。
最後に、2行モードを使って、文字と文字コードの対応を見てみます。
文字コードについての解説は、文字コードについてを参照してください。
unix# xd -2 euc.dat euc.dat 00000000: 41 42 b4 c1 bb fa 31 32 0a -- -- -- -- -- -- -- : A B 漢 字 1 2 _ unix# xd -2j jis.dat jis.dat 00000000: 41 42 1b 24 42 34 41 3b 7a 1b 28 42 31 32 0a -- : A B _ 漢 字 _ 1 2 _ unix# xd -2s sjis.dat sjis.dat 00000000: 41 42 8a bf 8e 9a 31 32 0a -- -- -- -- -- -- -- : A B 漢 字 1 2 _ |
JIS, SJIS, EUCでは、英数の文字コードは共通で1バイトで表します。
Aは41、Bは42のようになります。
各行の最後にある 0a を改行コードと呼びます。
この改行コードがあると、次の行に表示します。
漢字は、EUCとSJISは、漢字の文字コードが違いますが、2バイトで表しています。
これに対して、JISも漢字は2バイトで表しているのですが、漢字の前後にエスケープシーケンスと呼ばれる文字が入ります。
このエスケープシーケンスは、次の文字の種類を表すための文字コードです。
この例では、1b 24 42で漢字モードになり、1b 28 42で英数モードになっています。
文字コードの一覧や、エスケープシーケンスの一覧は、文字コードについてにありますので、いろいろなテキストを作成して16進ダンプしてみましょう。