2010年8月17日火曜日

Gawkで、UTF-8のファイルからBOMを除去する方法 - AWK

AWKの入出力関数とコマンド実行機能
Gawkでは、文字コードがUTF-8のファイルを扱う時は、BOM(UNICODE特有の、見えない文字)が入っていてはいけません。
でも、Windows XPのメモ帳で、UTF-8のファイルをお手軽に作成すると、BOMが必ず入ります。
そこで、BOMを除去する方法について、調べてみました。


**** BOMが入る例
o Windows XP (SP3)のメモ帳で作成し、文字コード UTF-8で保存した時、1行目の先頭にBOM(16進数表記で、EF BB BF)が入ります。


**** 対策方法
o 漢字のような全角文字を一切使っていない場合は、UTF-8ではなく、普通に(ANSIで)保存すると、正しく動きました。
o 他のテキストエディターを使って、BOMを入れないようにする方法もあります。
   + さくらエディタなど、BOMの有無を選択出来るものを選びます。
o 下のようなプログラムを使って、事前にBOMを取り除いてからAWKプログラムを実行するようにする方法もあります。


**** Gawkを使ってBOMを除去する方法(の例)
o 大量のファイルを変換したい時に、便利です。
o 変換用プログラムを作る時のポイントは、2つあります。
   + AWKプログラムを書く時は、日本語を使わず、半角文字だけで書く事
   + メモ帳でのファイルの保存は、UTF-8ではなく、普通に(ANSIで)保存する事

** NoBom.awk -- BOMを除去するAWKプログラムを作ります。
   + エクスプローラーで.awkが表示されない時は、「ファイルの拡張子を変更可能にする方法
--------
{
  if (FNR == 1) {
    sub(/\xef\xbb\xbf/,"");
  }
  print;
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。

** NoBom.bat -- 実行するバッチファイルを用意します。(例は、Windows用です)
o Gawk on Windows 3.1.7の場合。オプション「 -W ctype=UTF8」を追加します。
   + gawk.exeの部分は、実行したいAWKに置き換えて下さい。
   + このオプションは無くても問題ないみたいですが、念の為追加しました。
--------
if not exist in mkdir in
if not exist out mkdir out
cd in
for %%F in (*.*) do gawk.exe -W ctype=UTF8 -f ..\NoBom.awk "%%F" > ..\out\"%%F"
cd ..
pause
--------


o Gawk for Windows 3.1.6の場合
   + gawk.exeの部分は、実行したいAWKに置き換えて下さい。
--------
if not exist in mkdir in
if not exist out mkdir out
cd in
for %%F in (*.*) do gawk.exe -f ..\NoBom.awk "%%F" > ..\out\"%%F"
cd ..
pause
--------


** 上のバッチファイルを動かします。
   + NoBom.awkと、NoBom.batを、同じ場所に置きます。
   + 最初に一度、NoBom.batを実行します。inフォルダーとoutフォルダーが出来ます。
   + inフォルダーに、UTF-8で作ったAWKプログラムと入力ファイルを入れます。
   + NoBom.batを実行します。黒い画面が出て、最後に止まります。
   + エラーメッセージが出ていない事を確認して、何かキーを押します。
   + 繰り返し使う時は、inフォルダーや outフォルダーの中を、適当に掃除して下さい。


==
関連ページ:
    ▼AWKの入出力関数とコマンド実行機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > getline = ファイル(やパイプ)から1行読み込む
    print = ファイルなどに書き出す
    printf = 文字列を組み立ててファイルなどに書き出す
    +
    GawkでUTF-8のファイルを読み込む時の注意点