iconv はテキストファイルの文字コード変換を行うコマンドです。-f(入力側)と -t(出力側)でエンコーディングを指定し、//TRANSLIT や //IGNORE といった修飾子で変換不能文字の扱いも制御できます。
実務では「Shift_JIS を UTF-8 に統一」「ASCII へ近似変換」「壊れたバイト列の除去」などに使います。
構文(Syntax)
# 基本
iconv [OPTIONS] [-f FROMCODE] [-t TOCODE] [FILE...]
# 代表的な修飾子(主に GNU libiconv)
# TOCODE に付ける:UTF-8//TRANSLIT, UTF-8//IGNORE など
# //TRANSLIT : 近似文字に置換(例: ü -> u")
# //IGNORE : 変換不能文字を破棄
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-f, --from-code FROM | 入力の文字コードを指定 | iconv -f SHIFT_JIS -t UTF-8 in.txt |
-t, --to-code TO | 出力の文字コードを指定(//TRANSLIT, //IGNORE 可) | iconv -f UTF-8 -t ASCII//TRANSLIT in.txt |
-o, --output FILE | 出力ファイルを指定(リダイレクトの代替) | iconv -f SJIS -t UTF-8 -o out.txt in.txt |
-l, --list | サポートする符号化名の一覧を表示 | iconv -l |
-c | 変換不能文字を無視(破棄) | iconv -f EUC-JP -t UTF-8 -c in.txt |
-s, --silent | エラー時も黙って終了(警告抑制) | iconv -s -f SJIS -t UTF-8 in.txt |
--byte-subst=STR | 変換不能バイトを STR に置換 | iconv -f SJIS -t UTF-8 --byte-subst='�' in.txt |
--unicode-subst=STR | 変換不能のユニコードを STR に置換 | iconv -f UTF-8 -t SJIS --unicode-subst='?' in.txt |
--help, --version | ヘルプ/バージョン表示 | iconv --version |
変換不能文字の扱いは実装依存です。GNU libiconv/GLIBC では
//TRANSLIT///IGNOREが広く使えます。macOS/BSD でもほぼ同様ですが細部は異なる場合があります。
実行例
Shift_JIS → UTF-8 に変換(基本)
説明: 日本語テキストを UTF-8 に統一します。
コマンド:
iconv -f SHIFT_JIS -t UTF-8 input_sjis.txt > output_utf8.txt
ASCII へ “近似変換” する(ウムラウト等を代替)
説明: 非ASCII を似た文字に置換して ASCII に落とします。
コマンド:
iconv -f UTF-8 -t ASCII//TRANSLIT names.txt > names_ascii.txt
壊れたバイト列を無視して通す
説明: 不正なシーケンスで停止させたくない場合に。
コマンド:
iconv -f EUC-JP -t UTF-8//IGNORE raw.log > cleaned.log
一括変換(拡張子ごとに)
説明: ディレクトリ内の .txt を UTF-8 へ。
コマンド:
for f in *.txt; do iconv -f CP932 -t UTF-8 "$f" > "${f%.txt}.utf8.txt"; done
エラー例:不正バイトで失敗
説明: 入力の実際の符号化と -f が合わないとエラーになります。
コマンド:
printf '\xff' | iconv -f UTF-8 -t ASCII
出力例(例):
iconv: illegal input sequence at position 1
対処: 正しい -f を指定する、//IGNORE や -c / 置換オプションを使う。
関連コマンド
enca/uchardet: 文字コード推定ツール(iconvは自動判定しません)。nkf: 日本語向けの変換・改行変換(JIS/EUC/SJIS 等)。dos2unix/unix2dos: 改行コード変換(文字コードとは別問題)。file: 入力のバイト種別・推定エンコーディングの確認に。
備考
- 自動判定はしない:
iconvは入力の符号化を推測しません。必ず正しい-fを指定してください。 - 修飾子の付け方:
//TRANSLIT///IGNOREは TO 側に付けるのが一般的(例:-t UTF-8//IGNORE)。 - 実装差: GNU libiconv / glibc の
iconv(1)と、macOS/BSD や BusyBox 版では対応エンコーディングやオプションが一部異なります。動作が合わない場合はiconv -lやman iconvを確認。 - エンコーディング名の別名:
CP932とSHIFT_JIS、SJISなど同義の別名が存在します。iconv -lで受け付ける名称を把握しておくと安全です。 - インプレース風に書き換えたい: 直接は不可。
moreutilsのspongeを併用(例:iconv ... file | sponge file)か、テンポラリへ出力して置換します。 - パイプ/ストリーム: 標準入力/出力で動かすと大きなファイルでも無駄な一時ファイルを作らずに処理できます。
参考
- GNU libiconv(公式): https://www.gnu.org/software/libiconv/
- GNU libiconv マニュアル(
iconv(1)): https://www.gnu.org/software/libiconv/manual/html_node/iconv-Invocation.html - Linux man-pages
iconv(1)(コマンド): https://man7.org/linux/man-pages/man1/iconv.1.html - Linux man-pages
iconv(3)(ライブラリ関数の概要): https://man7.org/linux/man-pages/man3/iconv.3.html - FreeBSD
iconv(1)(実装差の確認に): https://man.freebsd.org/cgi/man.cgi?iconv(1) - BusyBox
iconv(簡易版): https://busybox.net/downloads/BusyBox.html

コメント