Linuxでファイルを扱っていると、文字コードの違いによる文字化けに遭遇することがあります。特に、WindowsとLinux間でファイルをやり取りする場合や、古いシステムからファイルを移行する場合に起きやすい問題です。
この記事では、nkfコマンド(Network Kanji Filter)を使った文字コード変換の方法を解説します。UTF-8への変換、改行コードの変換、一括変換の方法まで、実務で必要な操作をひと通りカバーしています。
・nkf は文字コードと改行コードを一括変換できる文字コード変換の定番ツール
・-w でUTF-8化、-Lu でLF化、--overwriteで上書き保存できる
・iconv との違いを理解すれば、Windows由来ファイルの文字化けに即対応できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ文字コード変換が必要なのか
日本語の文字コードには、主に以下の種類があります。
・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 [オプション] ファイル名
1. 文字コードを確認する(--guess / -g)
まず、ファイルの文字コードが何なのかを確認しましょう。
# ファイルの文字コードを確認する nkf --guess ファイル名 # 実行例 $ nkf --guess data.csv Shift_JIS (CRLF) # 短縮形でもOK $ nkf -g data.csv Shift_JIS (CRLF)
改行コードの表記は以下のとおりです。
・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 ファイル名 > 出力ファイル名
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)
改行コードの変換
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 ファイル名
Linux形式からWindows形式に変換する
# 改行コードをCRLF(Windows形式)に変換する nkf -Lw ファイル名 > 出力ファイル名 # Shift_JIS + CRLF でWindows向けに変換する nkf -s -Lw ファイル名 > 出力ファイル名
改行コード変換オプションのまとめは以下のとおりです。
・-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 {} +
nkfとiconvの使い分け
Linuxには文字コード変換のコマンドとして、nkfの他にiconv(アイコンブ)があります。それぞれの特徴を整理します。
| 比較項目 | nkf | iconv |
|---|---|---|
| 文字コードの自動判別 | 対応(--guess) | 非対応(入力コードの明示が必須) |
| 改行コード変換 | 対応(-Lu/-Lw/-Lm) | 非対応 |
| 対応文字コード | 日本語中心(UTF-8/Shift_JIS/EUC-JP/JIS) | 多言語対応(中国語・韓国語等も含む) |
| ファイル直接書き換え | 対応(--overwrite) | 非対応(リダイレクトが必要) |
| インストール | 追加インストールが必要な場合がある | glibcに含まれ、ほぼ標準で利用可能 |
参考として、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リポジトリを有効にする sudo dnf install epel-release
変換後も文字化けする場合の確認手順
nkfで変換したのに文字化けが直らない場合は、以下の手順で原因を切り分けてください。
1. 変換後の文字コードを確認する
# 変換後のファイルの文字コードを確認する $ nkf -g converted_file.txt UTF-8 (LF)
2. ターミナルの文字コード設定を確認する
ファイルの文字コードが正しくても、ターミナル(端末エミュレータ)の文字コード設定が異なっていると文字化けします。
# 現在のロケール(言語・文字コード設定)を確認する $ locale LANG=ja_JP.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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:compressコマンドでファイルを圧縮する方法|.Zファイルの解凍・オプションも解説
- 前のページへ:Linuxで日本語入力を設定する方法|IBus・fcitx5の導入から設定まで
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドK-O・テキスト処理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます