テキストファイルに使われる漢字コードは、現在、EUC、シフトJIS、JISコードが代表的だ。ネットワークなどによって、異機種間でのファイルのやりとりが多くなると、すべてのファイルの漢字コードを統一するのは難しい。
lessやjvim、muleなどは、使われている漢字コードを自動的に認識し、変換して表示してくれる。しかし、すべてのプログラムがそうなっているわけではない。特に、sedやAWK、Perlなどでフィルタ処理するときには、漢字コードの違いによって、処理結果が異なってくるので注意が必要だ。
漢字コードの変換プログラムには、いくつかあるが、nkfコマンドがよく使われる。nkfが便利なのは、入力ファイルの漢字コードを自動認識してくれることだ。出力コードは、EUC(e)、シフトJIS(s)、JIS(j)を指定できる(かっこ内は指定するときのオプション)。たとえば、
USER$ nkf -e infile
とするとinfileの内容をEUCコードに変換して標準出力に出力する(画面に表示する)。
nkfは漢字コードは変換してくれるけれど、改行コードは変換してくれない。改行コードを変換する方法もいろいろあるが、今回はtrを使ってみよう。
USER$ nkf -s infile | tr \\n \\r
とすれば、UNIXの改行コード(\n)をMacintoshの改行コード(\r)に変換する。MS-DOSの改行コード(\r\n)に変換するには、
USER$ nkf -e infile | tr \\n \\r\\n
のようにする。バックスラッシュを重ねているのは、シェルに特殊文字だと解釈されないようにするためである。次のように引用符で囲んでもよい。
USER$ nkf -e infile | tr '\n' '\r\n'
なお、trコマンドの入力は標準入力だけである。したがって、nkfやcatを用いて、trにデータを渡すか、リダイレクトする必要がある。
Column コマンドラインでの一括処理
変換するファイルがいくつもあるときは、シェルの機能を使って、一気に変換すると便利だ。たとえば、bashの場合は、次のようにする。>のプロンプトはfor文の続きを入力するためのプロンプトである。
USER$ mkdir sjis USER$ for f in *.doc ; do > nkf -s $f > sjis/$f > done
もし、カレントディレクトリにa.doc、b.doc、c.docというファイルがあれば、
nkf -s a.doc > sjis/a.doc nkf -s b.doc > sjis/b.doc nkf -s b.doc > sjis/c.doc
をしたことと同じになる。