作者: Bruce.
日時: 2005/12/5(12:26)
Bruce.です。

davi writes:

> Ken LundeさんのページでSJISを出力して、
> (http://www.praxagora.com/lunde/cjkv-char.html)
> SJIS文字をUnicodeのコード番号に変換して一覧表を作ろうと
> 作業を試みたのですが、ソフトによって採用している
> 変換テーブルに違いがあるようで、それぞれ結果が違い、
> 結構厄介です。

これには日本のプログラマーはたくさん泣かされているはずです。
RubyがUnicodifyされないのもこれが理由の一つだったかと。

> gawk --ctype=UTF8 -f X.awk jis0208.txt > out.txt
> 
> とやりました。
> 
> X.awkの中身は  { printf "%X\n",$1 };  だけで、
> 喰わせるデータも一文字一行にしましたが、これだと
> コード番号出力できないんですね…。
> (出力は全部0になる。)

%x(%X)は引数に整数を取りますから。
文字列(の先頭)渡しても変換に失敗してしまうので0になるんですね。

awklib/eg/lib/ord.awk に以下のパッチを当てて、ord関数を
使ってみてください。マルチバイト文字には使えないので、
一バイトずつ取り出して渡すことになりますが(その際には--ctypeを
ASCIIにしておくことをお忘れなく。substr()はキャラクタ単位で
働きますので)。

--- ord.awk.1~	2005-07-27 02:52:51.000000000 +0900
+++ ord.awk	2005-12-05 08:55:09.773437500 +0900
@@ -15,7 +15,7 @@
     low = sprintf("%c", 7) # BEL is ascii 7
     if (low == "\a") {    # regular ascii
         low = 0
-        high = 127
+        high = 255
     } else if (sprintf("%c", 128 + 7) == "\a") {
         # ascii, mark parity
         low = 128

いじょ。