文字変換ネタです
仕事柄メールで飛んできた文字列を Perlで処理させることが多いですが
(株) や ローマ数字 や ○で囲まれた数字 など
Windows固有文字 が入っているため UNIX上で文字化けして処理できない
ケースが多く悩みのタネです
そこで 以下のようなツールを作成しました
JIS固有文字を変換するフィルタ
目的
JISコードテキストの中の Windows固有文字列 ( (株) や ローマ数字 や ○で囲まれた数字 など ) を代替文字列に置換する
配布物
- jisfilter.c (10KB) C言語版ソースコード
- jisfilter.pl (6KB) Perl版スクリプト
- testjis.txt (1KB) サンプルテキスト(JIS)
- testjis_out.txt (1KB) サンプル変換後テキスト
配布物の利用方法
(C言語版の場合)
ソースコードを以下のようにコンパイルします gcc コンパイラ環境を想定しています
gcc -o jisfilter jisfilter.c
動作確認として以下のようにプログラムを実行し サンプルテキストを変換させます
./jisfilter < testjis.txt > testjis_out.txt
作成された testjis_out.txt を JISコード系が扱えるテキストエディッタで開いて 変換されているか確認します
(Perl版の場合)
動作確認として Perlスクリプトを以下のように実行し サンプルテキストを変換させます
perl jisfilter.pl < testjis.txt > testjis_out.txt
作成された testjis_out.txt を JISコード系が扱えるテキストエディッタで開いて 変換されているか確認します
参考 JISコードでの漢字の扱い
- ここで扱っている JIS とは ISO-2022-JP を指します
- コードは基本 7bit でありインターネットでのメッセージ送信に適しています
- 半角カタカナを扱える 8bit 拡張定義もあります
- コード体系に 複数セット 用意されており 0x1b(ESC) から始まるメッセージで必要な都度切り替えます
- 0x1b(ESC) 0x28(() 0x42(B) のメッセージで ASCIIセット(半角英数字)に切り替わります
- 0x1b(ESC) 0x28(() 0x4a(J) のメッセージで ラテン文字セット(JIS X 0201)に切り替わります
- 0x1b(ESC) 0x28(() 0x49(I) のメッセージで カタカナセット(JIS X 0201)に切り替わります
- 0x1b(ESC) 0x24($) 0x42(B) のメッセージで 漢字セット(JIS X 0208)に切り替わります
- 0x1b(ESC) 0x24($) 0x28(() 0x44(D) のメッセージで 拡張セット(拡張版 ISO-2022-JP-1)に切り替わります
- 開始時は ASCIIセット となっており テキストの終端も ASCIIセット に戻す必要があります
- ASCIIセットのみ 1文字=1byte その他のセットは基本 1文字=2byte です
実際の JISテキスト とそのバイナリデータ を比較してみます
test 74 65 73 74 0d0a
テスト 1b 24 42 2546 2539 2548 1b 28 42 0d0a
2007/08/12 32 30 30 37 2f 30 38 2f 31 32 0d0a
コードの青い部分は改行コードです 赤い部分がコードセットを変換している部分です