ここでは書式情報のない(プレーンな)テキストデータにおけるエンコーディングや改行コードの変換を行うコマンドについてを扱う。
元の記事はエンコーディング変換ツールについてと改行コード変換ツールについてそれぞれ2009年8月に書かれたが、これらを統合し、一部内容を書き直している。
エンコーディングの変換コマンド
iconv
概要
iconv
はOS(GNU/Linux)の基本部分に属するGNU Cライブラリ(glibc)に含まれるエンコーディング変換ツールで、GNU/Linuxではほとんどの場合にパッケージが利用可能(Debian/Ubuntuでは “libc-bin” パッケージに含まれる)。このコマンドが提供するエンコーディング変換機能はGNU Cライブラリ(glibc)の一部としてC言語で利用することもできる。
対応するエンコーディングは多く、世界中のエンコーディングを広く扱える。
以下、日本語に関係した一部のエンコーディング名を抜粋する。
- UTF-8
- CP932
- EUC-JP
- ISO-2022-JP
エンコーディング名は大文字/小文字を区別しない。
エンコーディング名のエイリアス
エンコーディング名は別名(エイリアス)を持つものがあり、幾つかの異なる名前で同じエンコーディングを指定できる。エイリアスの定義は/usr/lib/gconv/gconv-modules
[1]というテキストファイルに記述されている。例えば “CP932” の場合は
gconv-modules
alias WINDOWS-31J// CP932//
alias MS932// CP932//
alias SJIS-OPEN// CP932//
alias SJIS-WIN// CP932//
alias CSWINDOWS31J// CP932//
となっていて、 “alias” の1つ右に書かれた名前(“SJIS-WIN” など)は全て “CP932” 指定と等価となる。なお、 “SJIS” とこれを拡張した “CP932” は異なるエンコーディングとして扱われ、 “SJIS” のエイリアス定義は下のようになっている。
gconv-modules
alias SHIFT-JIS// SJIS//
alias SHIFT_JIS// SJIS//
alias MS_KANJI// SJIS//
alias CSSHIFTJIS// SJIS//
使い方
入力側のエンコーディング(自動検出は不可)を-f
オプション[2]で正しく指定し、変換後のエンコーディングを-t
オプション[3]で指定する。これらのオプションの省略時には現在のロケール設定に基づいたエンコーディング(GNU/Linuxでは基本的にUTF-8)が選択される。
出力先は-o
オプションで指定できる(指定した場所にファイルが存在する場合は内容が上書きされる)が、このオプションを付けないと標準出力に変換後の内容が出力されるため、パイプを用いて別のコマンドの標準入力として用いることもできる。
(CP932からUTF-8への変換例) $ iconv -f cp932 -t utf8 /path/to/cp932_input.txt -o /path/to/utf8_output.txt (UTF-8からEUC-JPへの変換例) $ iconv -f utf8 -t eucjp /path/to/utf8_input.txt -o /path/to/eucjp_output.txt (パイプを用いる例) $ cat /path/to/cp932_input.txt | iconv -f cp932 -t utf8 | less
nkfによるエンコーディング変換
nkf[4]は日本で開発・使用されてきた伝統的な日本語向けエンコーディング変換ツールで、改行コードの変換機能もあり、文字集合変換(例:ひらがなとカタカナの変換)などが行えるのも特徴。
ディストリのパッケージはほとんどのディストリで同名のパッケージ名でインストール可能。
入力側のエンコーディングは自動検出できる。出力先は通常では標準出力となるが、--overwrite
オプションを付けると直接入力ファイルを処理して上書きする。短いオプションの書式は見た目で効果が分かりにくいため、長い形式のオプション指定を推奨する。
(UTF-8に変換) $ nkf --utf8 /path/to/input.txt >| /path/to/utf8_output.txt $ nkf --utf8 --overwrite /path/to/input.txt (UTF-8で出力しつつ平仮名を片仮名に変換) $ nkf --utf8 --katakana /path/to/input.txt >| /path/to/utf8_output.txt $ nkf --utf8 --katakana --overwrite /path/to/input.txt (パイプを用いる例) $ cat /path/to/input.txt | nkf --utf8 | less
エンコーディング指定に関するオプションは以下のようになる(一部)。
オプション | 変換後のエンコーディング |
---|---|
--jis | ISO-2022-JP |
--euc | EUC-JP |
--sjis | Shift_JIS |
--utf8 | UTF-8 |
OSと改行コード
改行を示す文字はOSによって異なる。以下はその種類となる。
種類 | ASCIIコード | プログラム内表記 |
---|---|---|
CR [Carriage Return] | 0x0d | \r |
LF [Line Feed] | 0x0a | \n |
CR+LF | 0x0d 0x0a | \r\n |
OSと改行コードの関係は以下。
OS | 改行コード |
---|---|
DOS/Windows | CR+LF |
バージョン9系までのMac OS | CR |
広い意味でのUNIX系OS(GNU/LinuxやMac OS Xを含む) | LF |
GNU/Linux上で作成したテキストファイルは、(一部のエディタで他の改行コードを指定しない限り)LFを改行コードとして扱う。Mac OSの改行コードはOS XになってからLFに変わっている。
改行コードを変換するコマンド
以下のコマンドが改行コード変換に用いられる。いずれもほとんどのディストリでパッケージになっていて、パッケージ名もこれらのコマンド名そのままとなっている。
- Dos2Unix (Unix2Dos含む)
- nkf
Dos2Unix
Dos2Unixはその名の通り、DOS/WindowsのCR+LF改行を(広い意味での)UNIX系OSのLF改行に変換する。元のファイルを直接変更する点に注意。
(CR+LFからLFへ変換) $ dos2unix /path/to/crlf_input.txt
バージョン6.0.4時点では改行コードの変換は常にLFへの一方通行となっており、変換の方向を指定するオプションもないが、同パッケージがunix2dos
やmac2unix
といった他の(変換の方向に応じた)コマンドも提供しており、使い方・オプション指定も同様となっている。
Unix2Dos
Unix2DosはDos2Unixの一部として提供され、LF改行のファイルをCR+LF改行に変換する。このツールも元のファイルを直接変更する。
(LFからCR+LFへ変換) $ unix2dos /path/to/lf_input.txt
nkfによる改行コード変換
nkf
における改行コード変換関係のオプションを抜粋する。
オプション | 変換後の改行コード |
---|---|
--windows | CR+LF |
--mac | CR |
--unix | LF |
--overwrite
オプションを付けると元ファイルを上書きし、付けないと変換結果は標準出力に出力される。
(LF改行をCR+LF改行に変換) $ nkf --windows /path/to/lf_input.txt >| /path/to/crlf_output.txt $ nkf --windows --overwrite /path/to/lf_input.txt (CR+LF改行をLF改行に変換) $ nkf --unix /path/to/crlf_input.txt >| /path/to/lf_output.txt $ nkf --unix --overwrite /path/to/crlf_input.txt (SJISへの変換とCR+LF改行への変換を同時に行う) $ nkf --sjis --windows /path/to/lf_input.txt >| /path/to/sjis_crlf_output.txt $ nkf --sjis --windows --overwrite /path/to/lf_input.txt
その他のエンコーディング・改行コード変換ツール
nkfに近い機能を持つQKCというツールも存在する[5]が、ライセンスは自由ではなく[6]、機能的にも現在のnkfのほうが優れているなどのことから、GNU/Linuxディストリビューションにおいてもほとんどパッケージとしては用意されていない。
- glibc 2.21
- nkf 2.1.3
- Dos2Unix 6.0.4