2016/04/11

Linuxで使える、エンコーディングと改行コードの変換コマンド

ここでは書式情報のない(プレーンな)テキストデータにおけるエンコーディングや改行コードの変換を行うコマンドについてを扱う。

元の記事はエンコーディング変換ツールについてと改行コード変換ツールについてそれぞれ2009年8月に書かれたが、これらを統合し、一部内容を書き直している。

  1. エンコーディングの変換コマンド
    1. iconv
      1. 概要
      2. エンコーディング名のエイリアス
      3. 使い方
    2. nkfによるエンコーディング変換
  2. OSと改行コード
    1. 改行コードを変換するコマンド
      1. Dos2Unix
      2. Unix2Dos
      3. nkfによる改行コード変換
  3. その他のエンコーディング・改行コード変換ツール

エンコーディングの変換コマンド

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

エンコーディング指定に関するオプションは以下のようになる(一部)。

オプション変換後のエンコーディング
--jisISO-2022-JP
--eucEUC-JP
--sjisShift_JIS
--utf8UTF-8

OSと改行コード

改行を示す文字はOSによって異なる。以下はその種類となる。

種類ASCIIコードプログラム内表記
CR [Carriage Return]0x0d\r
LF [Line Feed]0x0a\n
CR+LF0x0d 0x0a\r\n

OSと改行コードの関係は以下。

OS改行コード
DOS/WindowsCR+LF
バージョン9系までのMac OSCR
広い意味での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への一方通行となっており、変換の方向を指定するオプションもないが、同パッケージがunix2dosmac2unixといった他の(変換の方向に応じた)コマンドも提供しており、使い方・オプション指定も同様となっている。

Unix2Dos

Unix2DosDos2Unixの一部として提供され、LF改行のファイルをCR+LF改行に変換する。このツールも元のファイルを直接変更する。

(LFからCR+LFへ変換)
$ unix2dos /path/to/lf_input.txt

nkfによる改行コード変換

nkfにおける改行コード変換関係のオプションを抜粋する。

オプション変換後の改行コード
--windowsCR+LF
--macCR
--unixLF

--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
[1]: Debian/Ubuntuでは/usr/lib/[アーキテクチャ名]/gconv/gconv-modulesとなっているなど、ディストリによって違いがある場合がある
[2]: “from” の “f”
[3]: “to” の “t”
[4]: 名前は “ネットワーク用漢字コード変換フィルタ” からきている
[5]: UNIX版をソースからビルドすると使用可能
[6]: 改変をせずに書庫のままであれば再頒布ができるとされているが、それ以上のことは認められていない