iconv – 文字コード(エンコーディング)を変換する

コマンドリファレンス

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///IGNORETO 側に付けるのが一般的(例: -t UTF-8//IGNORE)。
  • 実装差: GNU libiconv / glibc の iconv(1) と、macOS/BSD や BusyBox 版では対応エンコーディングやオプションが一部異なります。動作が合わない場合は iconv -lman iconv を確認。
  • エンコーディング名の別名: CP932SHIFT_JISSJIS など同義の別名が存在します。iconv -l で受け付ける名称を把握しておくと安全です。
  • インプレース風に書き換えたい: 直接は不可。moreutilssponge を併用(例: iconv ... file | sponge file)か、テンポラリへ出力して置換します。
  • パイプ/ストリーム: 標準入力/出力で動かすと大きなファイルでも無駄な一時ファイルを作らずに処理できます。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント