nkfコマンドで文字コードを変換する方法|UTF-8変換や改行コード変換もコマンド

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドK-O, テキスト処理コマンド > nkfコマンドで文字コードを変換する方法|UTF-8変換や改行コード変換もコマンド
「Windowsから転送したファイルが文字化けして読めない」「古いサーバーのファイルがEUC-JPで、今のシステムではまともに表示できない」

Linuxでファイルを扱っていると、文字コードの違いによる文字化けに遭遇することがあります。特に、WindowsとLinux間でファイルをやり取りする場合や、古いシステムからファイルを移行する場合に起きやすい問題です。

この記事では、nkfコマンド(Network Kanji Filter)を使った文字コード変換の方法を解説します。UTF-8への変換、改行コードの変換、一括変換の方法まで、実務で必要な操作をひと通りカバーしています。
【この記事でわかること】
・nkf は文字コードと改行コードを一括変換できる文字コード変換の定番ツール
・-w でUTF-8化、-Lu でLF化、--overwriteで上書き保存できる
・iconv との違いを理解すれば、Windows由来ファイルの文字化けに即対応できる

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ文字コード変換が必要なのか


日本語の文字コードには、主に以下の種類があります。

UTF-8:現在のLinuxの標準。ほぼすべてのディストリビューションでデフォルト
Shift_JIS:Windowsで長年使われてきた文字コード(Windows-31Jとも呼ばれる)
EUC-JP:かつてのLinux/UNIXの標準。古いサーバーで使われていることがある
ISO-2022-JP(JIS):メールで使われてきた文字コード

現在のLinuxはUTF-8が標準ですが、古いシステムのファイルはEUC-JPやShift_JISで保存されていることが珍しくありません。また、Windowsから転送したCSVファイルやテキストファイルはShift_JISであることが多く、そのままLinuxで開くと文字化けします。

こうした場面で活躍するのがnkfコマンドです。文字コードの自動判別と変換を一発で行えるため、現場では非常に重宝します。

nkfコマンドの基本的な使い方


nkfの基本構文は以下のとおりです。

# nkfコマンドの基本構文 nkf [オプション] ファイル名

nkfは入力ファイルの文字コードを自動判別するため、「変換元の文字コード」を指定する必要がありません。変換先の文字コードだけを指定すればOKです。

1. 文字コードを確認する(--guess / -g)


まず、ファイルの文字コードが何なのかを確認しましょう。

# ファイルの文字コードを確認する nkf --guess ファイル名 # 実行例 $ nkf --guess data.csv Shift_JIS (CRLF) # 短縮形でもOK $ nkf -g data.csv Shift_JIS (CRLF)

出力結果には文字コードと改行コードの両方が表示されます。上の例では「Shift_JISで、改行コードはCRLF(Windows形式)」であることがわかります。

改行コードの表記は以下のとおりです。

LF:Linux/Mac形式( )
CRLF:Windows形式( )
CR:旧Mac形式( )

2. UTF-8に変換する(-w)


現在最もよく使う変換です。Shift_JISやEUC-JPのファイルをUTF-8に変換します。

# UTF-8に変換して表示する nkf -w ファイル名 # 変換結果を新しいファイルに保存する nkf -w data_sjis.csv > data_utf8.csv # BOM付きUTF-8に変換する(Excel用途など) nkf -w8 ファイル名 > 出力ファイル名 # BOMなしUTF-8に変換する(明示的に指定する場合) nkf -w80 ファイル名 > 出力ファイル名

補足:-wオプションはBOMなしUTF-8を出力します。ExcelでUTF-8のCSVを開くとき、BOMがないと文字化けすることがあります。その場合は -w8 を使ってBOM付きで出力してください。

3. Shift_JISに変換する(-s)


LinuxのファイルをWindowsに渡す場合など、Shift_JISに変換が必要な場面で使います。

# Shift_JISに変換する nkf -s ファイル名 > 出力ファイル名 # 実行例 $ nkf -s report_utf8.txt > report_sjis.txt $ nkf -g report_sjis.txt Shift_JIS (LF)

4. EUC-JPに変換する(-e)


古いシステムとの互換性が必要な場合に使います。現在の新規開発でEUC-JPを選ぶことはほぼありませんが、既存システムの保守では必要になることがあります。

# EUC-JPに変換する nkf -e ファイル名 > 出力ファイル名

5. ファイルを直接書き換える(--overwrite)


リダイレクトで新しいファイルを作るのではなく、元のファイルを直接書き換えたい場合は --overwrite オプションを使います。

# ファイルを直接UTF-8に書き換える nkf -w --overwrite ファイル名 # 実行例 $ nkf -g config.txt Shift_JIS (CRLF) $ nkf -w --overwrite config.txt $ nkf -g config.txt UTF-8 (CRLF)

※--overwrite は元のファイルを直接書き換えるため、変換前のバックアップを取っておくことをおすすめします。

改行コードの変換


WindowsとLinuxでは改行コードが異なります。WindowsはCRLF(\r )、LinuxはLF( )です。文字コードだけでなく改行コードの違いも、ファイル共有時のトラブルの原因になります。

nkfは文字コードと改行コードを同時に変換できるのが大きな強みです。

Windows形式(CRLF)からLinux形式(LF)に変換する


# 改行コードをLF(Linux形式)に変換する nkf -Lu ファイル名 > 出力ファイル名 # 文字コードも同時にUTF-8に変換する nkf -w -Lu ファイル名 > 出力ファイル名 # 直接書き換える場合 nkf -w -Lu --overwrite ファイル名

-Lu の「u」はUNIX形式(LF)を意味します。WindowsからLinuxにファイルを持ってきたとき、シェルスクリプトの1行目に \r が残っていると「bad interpreter」エラーが出ることがあります。この場合は -Lu で改行コードを変換してください。

Linux形式からWindows形式に変換する


# 改行コードをCRLF(Windows形式)に変換する nkf -Lw ファイル名 > 出力ファイル名 # Shift_JIS + CRLF でWindows向けに変換する nkf -s -Lw ファイル名 > 出力ファイル名

-Lw の「w」はWindows形式(CRLF)です。LinuxからWindowsにCSVファイルを渡す場合は、文字コードをShift_JISにして、改行コードもCRLFにしておくとトラブルが減ります。

改行コード変換オプションのまとめは以下のとおりです。

-Lu:LF(Linux/Mac形式)に変換
-Lw:CRLF(Windows形式)に変換
-Lm:CR(旧Mac形式)に変換

応用・実務Tips


複数ファイルを一括変換する


--overwrite オプションはワイルドカードや複数ファイル指定に対応しています。

# カレントディレクトリの全txtファイルをUTF-8に一括変換する nkf -w --overwrite *.txt # findコマンドと組み合わせてサブディレクトリも含めて一括変換する find /path/to/dir -name "*.csv" -exec nkf -w --overwrite {} \; # 事前に変換対象の文字コードを確認する find /path/to/dir -name "*.csv" -exec nkf -g {} +

一括変換の前には、必ず対象ファイルの文字コードを確認してください。すでにUTF-8のファイルに対して変換をかけても壊れることはほぼありませんが、想定外のファイルが混ざっていないか事前にチェックする習慣が大切です。

nkfとiconvの使い分け


Linuxには文字コード変換のコマンドとして、nkfの他にiconv(アイコンブ)があります。それぞれの特徴を整理します。

比較項目 nkf iconv
文字コードの自動判別 対応(--guess) 非対応(入力コードの明示が必須)
改行コード変換 対応(-Lu/-Lw/-Lm) 非対応
対応文字コード 日本語中心(UTF-8/Shift_JIS/EUC-JP/JIS) 多言語対応(中国語・韓国語等も含む)
ファイル直接書き換え 対応(--overwrite) 非対応(リダイレクトが必要)
インストール 追加インストールが必要な場合がある glibcに含まれ、ほぼ標準で利用可能
結論:日本語ファイルの変換であればnkfが圧倒的に便利です。文字コードの自動判別と改行コード変換を同時にできるのは大きなメリットです。一方、中国語や韓国語など日本語以外の文字コード変換が必要な場合はiconvを使います。

参考として、iconvの基本的な使い方も紹介します。

# iconvの基本構文(入力コードと出力コードの指定が必須) iconv -f Shift_JIS -t UTF-8 入力ファイル > 出力ファイル # 対応している文字コードの一覧を表示する iconv -l

トラブルシュート・エラー対処


「nkf: command not found」が出た時の対処法


nkfはディストリビューションによっては初期状態でインストールされていません。以下のコマンドでインストールしてください。

# RHEL/CentOS/AlmaLinux/Rocky Linuxの場合 sudo dnf install nkf # RHEL 7以前の場合 sudo yum install nkf # Ubuntu/Debianの場合 sudo apt install nkf

EPELリポジトリが必要な場合があります。dnf installでパッケージが見つからない場合は、先に以下を実行してください。

# EPELリポジトリを有効にする sudo dnf install epel-release

変換後も文字化けする場合の確認手順


nkfで変換したのに文字化けが直らない場合は、以下の手順で原因を切り分けてください。

1. 変換後の文字コードを確認する


# 変換後のファイルの文字コードを確認する $ nkf -g converted_file.txt UTF-8 (LF)

期待どおりの文字コードになっているか確認します。

2. ターミナルの文字コード設定を確認する


ファイルの文字コードが正しくても、ターミナル(端末エミュレータ)の文字コード設定が異なっていると文字化けします。

# 現在のロケール(言語・文字コード設定)を確認する $ locale LANG=ja_JP.UTF-8

LANGがUTF-8であれば、ターミナル側の問題ではありません。

3. fileコマンドでも文字コードを確認する


nkfの--guessと結果が異なる場合、ファイルの中身が破損している可能性があります。

# fileコマンドで文字コードを確認する $ file -i data.csv data.csv: text/plain; charset=utf-8

4. 二重変換していないか確認する


すでにUTF-8のファイルに対して「Shift_JISからUTF-8への変換」を行うと、文字化けが発生します。nkfは自動判別なので通常は問題ありませんが、-S(入力をShift_JISとして扱う)などで入力文字コードを明示的に指定した場合に起こり得ます。

# 入力文字コードを明示指定する場合は、事前に--guessで確認する $ nkf -g target.txt UTF-8 (LF) # すでにUTF-8なら変換不要

本記事のまとめ


nkfコマンドの使い方を、文字コードの確認から変換、改行コードの変換まで解説しました。

やりたいこと コマンド
文字コードを確認する nkf --guess ファイル名
UTF-8に変換する nkf -w ファイル名 > 出力ファイル名
BOM付きUTF-8に変換する nkf -w8 ファイル名 > 出力ファイル名
Shift_JISに変換する nkf -s ファイル名 > 出力ファイル名
EUC-JPに変換する nkf -e ファイル名 > 出力ファイル名
ファイルを直接書き換える nkf -w --overwrite ファイル名
改行コードをLFに変換する nkf -Lu ファイル名 > 出力ファイル名
改行コードをCRLFに変換する nkf -Lw ファイル名 > 出力ファイル名
複数ファイルを一括変換する nkf -w --overwrite *.txt
nkfをインストールする sudo dnf install nkf

文字化けトラブルを一瞬で解決したい方へ

nkf・iconv を使い分けられると、現場の文字化け対応が圧倒的にスムーズになります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。