ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

文字コードと16進ダンプ

 文字コードを理解するためには、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進ダンプ表示

 これらのファイルをそのまま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進ダンプしてみましょう。



Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp