JISテキスト変換 Windows固有文字の変換

文字変換ネタです

仕事柄メールで飛んできた文字列を Perlで処理させることが多いですが
(株) や ローマ数字 や ○で囲まれた数字 など
Windows固有文字 が入っているため UNIX上で文字化けして処理できない
ケースが多く悩みのタネです

そこで 以下のようなツールを作成しました

JIS固有文字を変換するフィルタ

目的

JISコードテキストの中の Windows固有文字列 ( (株) や ローマ数字 や ○で囲まれた数字 など ) を代替文字列に置換する

配布物

jisfilter.zip (5KB) アーカイブの中身は以下の通りです
  • 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
コードの青い部分は改行コードです 赤い部分がコードセットを変換している部分です