Linuxでファイルを扱っていると、文字コードの違いによる文字化けに遭遇することがあります。特に、WindowsとLinux間でファイルをやり取りする場合や、古いシステムからファイルを移行する場合に起きやすい問題です。
この記事では、nkfコマンド(Network Kanji Filter)を使った文字コード変換の方法を解説します。文字コードの確認から、UTF-8・Shift_JIS・EUC-JPの相互変換、改行コードの変換、一括変換、よくあるトラブルの対処法まで、実務で必要な操作をひと通りカバーしています。
この記事のポイント
・nkfは文字コードと改行コードを自動判別して一括変換できる日本語向けの定番ツール
・-wでUTF-8化、-Luで改行コードをLF化、--overwriteで元ファイルを直接書き換えられる
・--guessで変換前に文字コードを確認してから作業するのが実務の基本手順
・iconvとの使い分け:日本語ファイルはnkf、多言語対応が必要な場合はiconv
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ文字コード変換が必要なのか
日本語の文字コードには、主に以下の種類があります。
| 文字コード | 主な用途 | 特徴 |
|---|---|---|
| UTF-8 | 現在のLinux・Web全般・GitHub | 世界標準。ほぼすべてのディストリビューションでデフォルト |
| Shift_JIS(CP932) | Windowsのデフォルト、Excelの既定値 | Windowsで長年使われてきた日本語エンコード |
| EUC-JP | 2000年代以前のLinux/UNIXサーバー | 旧来のLinux標準。古いシステムで今も残っている |
| ISO-2022-JP(JIS) | メール(特に旧来のシステム) | 7ビット符号化。現在はほぼ使われない |
文字化けは「翻訳ルールが違う辞書を使って読んだ結果」と考えるとわかりやすいです。Shift_JISのファイルをUTF-8として読み込もうとするため、意味不明な文字の羅列になってしまいます。
こうした場面で活躍するのが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形式( )
nkfの--guessは日本語エンコードの判定精度が高く現場でよく使われます。
file -i ファイル名でもMIMEタイプ付きで確認できますが、Shift_JISをiso-8859-1と誤検出することがあるため、日本語ファイルはnkf --guessを優先してください。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( )、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 {} +
WSL2でWindowsのCSVファイルを変換する
WSL2(Windows Subsystem for Linux 2)を使っていると、WindowsのドライブはLinux側から
/mnt/c/ 以下でアクセスできます。Windowsで作ったShift_JISのCSVをnkfでUTF-8に変換してから処理する流れを見てみましょう。# Windowsのドキュメントフォルダにあるファイルを確認する $ ls /mnt/c/Users/username/Documents/ sales.csv report.xlsx # 文字コードを確認する $ nkf -g /mnt/c/Users/username/Documents/sales.csv Shift_JIS (CRLF) # UTF-8 + LFに変換してホームディレクトリに保存する $ nkf -w -Lu /mnt/c/Users/username/Documents/sales.csv > ~/sales_utf8.csv # 変換結果を確認する $ nkf -g ~/sales_utf8.csv UTF-8 (LF) $ head -3 ~/sales_utf8.csv 日付,商品名,金額 2024-01-01,りんご,200
-w -Lu を組み合わせることで、文字コードと改行コードを一発で変換できます。nkfとiconvの使い分け
Linuxには文字コード変換のコマンドとして、nkfの他にiconv(アイコンブ)があります。iconvはglibcに含まれておりほぼすべてのLinux環境に標準で入っていますが、入力文字コードの明示が必須です。それぞれの特徴を整理します。
| 比較項目 | nkf | iconv |
|---|---|---|
| 文字コードの自動判別 | 対応(--guess) | 非対応(入力コードの明示が必須) |
| 改行コード変換 | 対応(-Lu/-Lw/-Lm) | 非対応 |
| 対応文字コード | 日本語中心(UTF-8/Shift_JIS/EUC-JP/JIS) | 多言語対応(中国語・韓国語等も含む) |
| ファイル直接書き換え | 対応(--overwrite) | 非対応(リダイレクトが必要) |
| インストール | 追加インストールが必要な場合がある | glibcに含まれ、ほぼ標準で利用可能 |
参考として、iconvの基本的な使い方も紹介します。なお、WindowsのExcelが保存するShift_JISはCP932(Windows拡張Shift_JIS)と呼ばれる亜種のため、
-f SHIFT-JISでエラーが出る場合は-f CP932に切り替えてください。# iconvの基本構文(入力コードと出力コードの指定が必須) iconv -f SHIFT-JIS -t UTF-8 入力ファイル > 出力ファイル # Excelファイル由来でエラーが出る場合はCP932を試す iconv -f CP932 -t UTF-8 入力ファイル > 出力ファイル # 変換できない文字をスキップする(-c オプション) iconv -c -f CP932 -t UTF-8 入力ファイル > 出力ファイル # 対応している文字コードの一覧を表示する iconv --list
トラブルシュート・エラー対処
文字コード変換でよくあるトラブルと対処法をまとめます。nkfをインストールしていない場合は「nkf: command not found」が出るため、まずインストールから始めてください。
「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なら変換不要
5. vimで文字化けして見える場合
ファイルの文字コードは正しいのに、vimで開いたときに文字化けして見える場合があります。vimが古い文字コードで開いている可能性があるため、コマンドモードで以下を入力してUTF-8として読み直してください。
# vimでUTF-8として読み直す :e ++enc=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をインストールする(RHEL系) | sudo dnf install nkf |
| nkfをインストールする(Ubuntu/Debian) | sudo apt install nkf |
文字化けトラブルを一瞬で解決したい方へ
nkf・iconv を使い分けられると、現場の文字化け対応が圧倒的にスムーズになります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 次のページへ:compressコマンドでファイルを圧縮する方法|.Zファイルの解凍・オプションも解説
- 前のページへ:Linuxで日本語入力を設定する方法|IBus・fcitx5の導入から設定まで
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドK-O・テキスト処理コマンドへ戻る

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