nkf – 日本語テキストの文字コード/改行を賢く変換する(Network Kanji Filter)

改行・空白処理 置換・変換

nkf は日本語テキストの文字コード自動判定相互変換、および改行コード変換MIME(=?…?=) のデコード/エンコードを行うコマンドです。
実務では「CP932/Shift_JIS を UTF-8 に統一」「メールの MIME ヘッダを可読化」「LF/CRLF をそろえる」などで使われます。

構文(Syntax)

nkf [OPTIONS] [FILE...]
# 標準入力/出力も利用可能
cat in.txt | nkf [OPTIONS] > out.txt

主なオプション一覧

オプション説明使用例
-w / -e / -s / -j出力エンコーディングを UTF-8/EUC-JP/Shift_JIS/ISO-2022-JP(JIS) に指定nkf -w in.txt > out.txt
-g / --guess入力の推定文字コード名のみを表示nkf -g file.txt
--ic=ENC / --oc=ENC入力/出力エンコーディングを明示(例: CP932, UTF-8-BOM, UTF-16LE など)nkf --ic=CP932 --oc=UTF-8 in.txt > out.txt
--overwrite変換結果で元ファイルを上書き(複数ファイル可)nkf -w --overwrite *.txt
-Lu / -Lw / -Lm改行を LF/CRLF/CR に統一(Unix/Win/Mac(旧))nkf -w -Lw --overwrite doc.txt
-m / -MMIME (RFC 2047) をデコード / エンコードecho '=?ISO-2022-JP?B?...?=' | nkf -m -w
-h / -Vヘルプ / バージョン表示nkf -h
参考: 入力コード指定 -J/-E/-S自動判定ではなく、入力を JIS/EUC/Shift_JIS とみなすnkf -J -w in.txt

例: UTF-8 に BOM を付けたい場合は --oc=UTF-8-BOM を使用します。

実行例

UTF-8(LF) に統一(出力は別ファイルへ)

説明: Windows系の CP932/Shift_JIS を自動判定して UTF-8/LF にします。
コマンド:

nkf -w -Lu input_sjis.txt > output_utf8.txt

既存ファイルをそのまま上書き変換

説明: ディレクトリ内の .txt を UTF-8 に変換して 上書きします。
コマンド:

nkf -w --overwrite *.txt

MIME エンコードされたメール件名を可読化

説明: =?ISO-2022-JP?B?...?= のようなヘッダをデコード。
コマンド:

echo '=?ISO-2022-JP?B?GyRCJDMkbCQkRyQbKEI=?=' | nkf -m -w

改行を CRLF(Windows)にしつつエンコーディングは維持

説明: 文字コードは自動判定のまま、改行だけ Windows 形式に。
コマンド:

nkf -Lw --overwrite README.md

エラー例:存在しないファイルを指定

説明: ファイル名の誤りで失敗します。
コマンド:

nkf -w notfound.txt

出力例(例):

nkf: notfound.txt: No such file or directory

関連コマンド

  • iconv : 汎用の文字コード変換(自動判定なし、厳密制御)。
  • dos2unix / unix2dos : 改行コード(CRLF/LF)の相互変換専用。
  • recode : 文字コードの総合変換ツール。
  • enca / uchardet : 文字コード推定(nkf -g と使い分け)。

備考

  • 自動判定の限界: nkf の判定は実用的ですが万能ではありません。誤判定が疑われる場合は --ic=-J/-E/-S で入力を明示しましょう。
  • Windows-31J/CP932 拡張: 日本語環境では CP932(いわゆる Windows-31J)特有の外字/NEC 選定文字が混在します。nkf は実運用に配慮した変換を行いますが、厳密な互換が必要ならテストを。
  • BOM の扱い: UTF-8 出力は既定で BOM なし。必要に応じて --oc=UTF-8-BOM を指定。
  • ストリーム処理: 大きなファイルはパイプで流して一時ファイルを避けると安全です。
  • 権限と上書き: --overwrite は元ファイルを破壊的に変更します。VC 管理下ではコミット前に差分確認を。

参考

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント