UNIX/Linuxの部屋 コマンド:iconv

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド iconv 文字コードを変換する (パイプ) このエントリーをはてなブックマークに追加

最終更新


UNIX/Linux における iconv コマンドは、ファイルの文字コード (エンコーディング) を変換するコマンドである。



iconv コマンドの基本的な使い方
iconv コマンドを使ってファイルの文字コードを変換する例を以下に示す。-f と -t オプションを使って、変換元文字コードと変換後文字コードの両方を指定する必要がある。
% iconv -f EUC-JP -t Shift_JIS < infile.txt > outfile.txt
⇒ infile.txt の文字コードを EUC-JP とみなし、Shift_JIS に変換して outfile.txt に出力する。
% iconv -f EUC-JP -t UTF-8 < infile.txt > outfile.txt
⇒ EUC-JP から UTF-8 に変換する。

FreeBSD など一部の iconv では、変換元か変換後のいずれかの文字コードを省略した場合、環境変数 LC_ALL や LANG などに設定されているロケールを使用するが、すべての iconv でそのような挙動をするとは限らない。

不正文字の扱い
入力ファイルに無効な文字 (-f で指定した文字コードと矛盾するようなデータ) が含まれていた場合や、-f で指定した文字コードを -t で指定した文字コードで変換できない場合、iconv コマンドはエラーとして終了してしまう。例えば、「草なぎ剛」の「なぎ」は JIS X 0213 に含まれる文字であるが、Shift_JIS には含まれていない。そのため、
% echo '草なぎ剛' | iconv -f utf-8 -t shift_jis
iconv: 位置 3 で不正な入力シーケンスがありました
のように UTF-8 を Shift_JIS に変換しようとすると、エラーとなってしまう (本サイトは EUC-JP で記載されているので、やむを得ず「草なぎ」と表記したが、実際に試す際は「なぎ」を漢字にしてほしい)。同様に、ギリシャ数字の I・II や、いわゆる「はしご高」も同じようにエラーになる。

FreeBSD・Linux・Solaris など多くの iconv では -c オプションを指定することで、無効な文字を無視して続行することができる (2000年頃は Solaris の iconv コマンドでは -c オプションが使えなかった気がするが、Solaris10 では問題なく使えるようだ)。しかしながら不正データをスキップしてしまうため、
% echo '草なぎ剛 | iconv -c -f utf-8 -t shift_jis | iconv -f shift_jis -t utf-8
草剛
のように UTF-8 → Shift_JIS → UTF-8 とすると、変換できなかった文字が欠落してしまう。

文字コード (エンコーディング名)
iconv コマンドで指定できる文字コードは OS によって異なる。例えば HP-UX では EUC-JP や euc-jp ではダメで、eucjp としなくてはいけない。
使用可能な文字コード一覧を調べる方法は iconv の実装によって異なるため、以下の方法を試してみてほしい。
% iconv -l
⇒ 使用可能な文字コード一覧を表示 (FreeBSD の iconv、Linux の iconv で確認)
% iconv --list
⇒ 使用可能な文字コード一覧を表示 (Linux の iconv で確認)
% man iconv
⇒ 文字コード一覧表示機能がない場合はマニュアルを読むこと

もし上記で見つからない場合、日本において使用頻度が高いと思われる文字コードを以下に示すので、いろいろ試してほしい。なお、いわゆる機種依存文字を扱う場合は、UTF-8、CP932、EUCJP-WIN、SJIS-WIN などを使うことになると思われる。
  • UTF-8、UTF8
  • UTF-16、UTF16
  • EUC-JP、EUCJP、EUCJP-WIN、EUC-JISX0213
  • Shift_JIS、sjis、SJIS-WIN、SHIFT_JISX0213、CP932、MS932
  • ISO-2022-JP、ISO-2022-JP-2、ISO-2022-JP-3

一般的には IANA が管理する "Character Sets" での定義が正であるはずだが、登録却下されたはずの ISO-2022-JP-3 が FreeBSD や Linux の iconv で使えるようなので、独自拡張しているのかもしれない。

//IGNORE と //TRANSLIT
GNU iconv のみの実装かもしれないが、文字コードの末尾に //IGNORE や //TRANSLIT を付けることができる。//IGNORE は不正コードが見つかった場合、その文字を破棄し、最後にエラー出力する (-c オプションと似ている)。一方、
//TRANSLIT は近しい文字に置換を試みるが、近しい文字がなかった場合は「?」に置換する。
% cat i ii iii (株) 高 | iconv -f utf-8 -t shift_jis//TRANSLIT
i ii iii (株) 高
→ ギリシャ数字や(株)・はしご高などが、近しい文字に置換される (本サイトは EUC-JP で記載されており、ギリシャ数字などをそのまま書くことができないので雰囲気だけ掴んでほしい)

FreeBSD の iconv
少なくとも FreeBSD 10-RELEASE より iconv が libc に含まれるようになった。それ以前は port/package にて GNU iconv が使われていたような気がする。

関連コマンド
iconv コマンドはファイル内容のエンコーディングを変換するコマンドである。「ファイル名」のエンコーディングを変換する場合は、convmv コマンドを使うこと。

iconv コマンドはロケールの仕組みにのっとった正統派文字コード変換コマンドと言える。nkf コマンドや qkc コマンドは日本語専用のため、便利ではあるが正統派とはいえないが、nkf コマンドなどは自動で文字コードを推測してくれるなどの便利機能があるので、用途によって使い分けるとよい。
>> Solaris10オンラインマニュアル(man) Solaris10 iconv(1)
>> Linuxオンラインマニュアル(man) Linux iconv(3)
>> Linuxオンラインマニュアル(man) Linux iconv(1)

読み方 iconv (C関数) (UNIXコマンド) [あい・こんぶ] このエントリーをはてなブックマークに追加

エンコーディング (文字コード) 変換関数、あるいはエンコーディング変換コマンド、あるいはそのライブラリ。由来は international converter あたりではないか。