Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
MySQLでの文字列処理の動作を調べる前に、そのときに利用する ツールについてちょっとだけ書いておく。 MySQLのためというより、文字列について調べるには常に必要なものである。
文字列を扱うとき、どういうバイト列かを16進表示して、 はっきり確認したくなる。 文字列処理について原因を究明したい場合の手段である。
なお、本ページの文字コードは、すべてEUC-JPになっている。
od
Unixでダンプするといったら、なんといっても od だろう。
$ echo -n '漢字表示' | od 0000000 140664 175273 136711 124274 0000010
od は octal dump のことなので、デフォルトは8進ダンプになってしまう。 文字列を扱おうとしているので、これでは都合が悪い。
16進ダンプするには、 -x とするようだ。
$ echo -n '漢字表示' | od -x 0000000 c1b4 fabb bdc9 a8bc 0000010
「漢」が c1b4 と表示されたが、変である。 EUCーJPでは、漢のコードは b4c1 なのである。 どうも、2バイト単位で勝手にまとめてくれるようで、困ったものである。
$ echo -n '漢字表示' | od -tx1 0000000 b4 c1 bb fa c9 bd bc a8 0000010
これで、やっと使い物になってきた。 ということで、バイト単位の16進ダンプの方法だけ憶えておこう。
バイト単位の16進ダンプ: od -tx1
hexdump
hexdumpという、16進ダンプならこれ、というようなコマンドが用意されている。 しかし、それほど便利なものではないと私は思っていて、使っていない。
echo -n '漢字表示' | hexdump 0000000 c1b4 fabb bdc9 a8bc 0000008
これだと、2バイト単位であり、バイトが逆順になってしまうので、 -C をつけると、1バイト単位、要するにCharacter単位になる。
$ echo -n '漢字表示' | hexdump -C 00000000 b4 c1 bb fa c9 bd bc a8 |........| 00000008
詳しくは、man を見よう。
xxd
16進ダンプと、16進数ダンプからの元にもどすこともできるコマンドがある。
$ echo -n '漢字表示' | xxd 0000000: b4c1 bbfa c9bd bca8 ........
デフォルトでは、2バイトずつになるので、1バイトずつにするには -g のあとに、バイト数を書く。 gとはちょっと変な感じなんだが、groupのことである。
$ echo -n '漢字表示' | xxd -g 1 0000000: b4 c1 bb fa c9 bd bc a8 ........
ぜんぶ繋げた出力が欲しければ、-g 0 とする。
$ echo -n '漢字表示' | xxd -g 0 0000000: b4c1bbfac9bdbca8 ........
アドレスなど余分なものをつけたくない時には、-p をつける。 このときは、-g 0 に勝手になるようだ。
$ echo -n '漢字表示' | xxd -p b4c1bbfac9bdbca8
16進表示ではなく、2進表示が欲しければ、-b である。
$ echo -n '漢字表示' | xxd -b 0000000: 10110100 11000001 10111011 11111010 11001001 10111101 ...... 0000006: 10111100 10101000
では、逆変換をやってみよう。
$ echo -n 'b4 c1 bb fa c9 bd bc a8' | xxd -r -p 漢字表示$ echo -n 'b4c1bbfac9bdbca8' | xxd -r -p 漢字表示
xxdは逆変換するので、漢字表示と出力されるが、改行はされない。 途中にスペースがあってもなくても同じように逆変換される。 -p がないと、16進ダンプした形式、つまりアドレスも必要になる。
まだまだ機能はあるが、詳しくは man xxd を見よう。
16進ダンプ: xxd -g 1
16進逆ダンプ: xxd -r -p
次へ:キャラクタコード変換ツール(nkf, iconv, kcc)
フィードバック:
There is no comment.