Linuxの文字コード判定と変換コマンドまとめ|nkf・iconv・file -iと文字化け対処

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, テキスト処理コマンド > Linuxの文字コード判定と変換コマンドまとめ|nkf・iconv・file -iと文字化け対処
「ログファイルを開いたら文字化けしていて読めない」「Windowsから受け取ったCSVをLinuxで処理しようとしたらエラーが出る」——こんな経験はないでしょうか。
Linuxでは、UTF-8・Shift_JIS・EUC-JPなど複数の文字コードが共存するため、適切な判定と変換ができないと作業が止まります。

この記事では、file -inkficonv の3コマンドを軸に、文字コードの判定から変換、文字化け対処の実践的な手順を解説します。
ロケール設定やBOM対処まで含め、現場でそのまま使える内容にまとめました。

この記事のポイント

file -i ファイル名 でMIMEタイプと文字コードを即確認できる
nkf -g ファイル名 はJIS/Shift_JIS/EUC-JP/UTF-8の判定が得意
iconv -f 変換元 -t 変換先 -o 出力ファイル 入力ファイル で確実に変換できる
・BOM付きUTF-8は nkf --overwrite --oc=UTF-8 で除去できる


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

Linuxで文字コードの問題が起きる理由

Linuxのデフォルト文字コードは現在ほぼ UTF-8 に統一されていますが、以下のような場面では依然として文字コードの不一致が発生します。

・Windowsで作成したCSVやテキストファイル(Shift_JISが多い)
・古いLinuxサーバーやEUC-JP環境から移行してきたデータ
・メールシステムや古いWebアプリが出力したJISコードのログ
・BOM付きUTF-8(Windows Notepadが自動付与することがある)

このような場合、コマンドを実行するとエラーが出たり、文字化けしたまま処理が進んで結果が壊れたりします。対処の第一歩は「まずファイルの文字コードを正確に判定すること」です。

file -i コマンドで文字コードを確認する

file コマンドは、ファイルの種類やMIMEタイプを表示するコマンドです。-i オプションを使うと、文字コード(charset)も表示されます。

1. 基本的な使い方

# ファイルの文字コードをMIMEタイプと一緒に確認する $ file -i sample.txt sample.txt: text/plain; charset=utf-8 # Shift_JISファイルの場合 $ file -i sjis_log.txt sjis_log.txt: text/plain; charset=iso-8859-1

注意点があります。file コマンドはShift_JISを正確に判定できないことがあります。上の例で charset=iso-8859-1 と表示された場合、実際にはShift_JISの可能性が高いです。

2. 複数ファイルをまとめて確認する

# ディレクトリ内の全テキストファイルを一覧で確認する $ file -i /var/log/*.log /var/log/messages: text/plain; charset=utf-8 /var/log/secure: text/plain; charset=utf-8 /var/log/maillog: text/plain; charset=us-ascii

file -i はShift_JISの判別精度に限界があるため、日本語ファイルの判定には次に紹介する nkf -g を併用するのがおすすめです。

nkf コマンドで文字コードを判定・変換する

nkf(Network Kanji Filter)は、JIS・Shift_JIS・EUC-JP・UTF-8の変換に特化した日本語処理ツールです。file -i よりも日本語文字コードの判定精度が高く、変換も同時に行えます。

1. インストール確認とインストール方法

# インストール確認 $ which nkf /usr/bin/nkf # RHEL/CentOS/AlmaLinux/Rocky Linux の場合 $ sudo dnf install nkf # Ubuntu/Debian の場合 $ sudo apt install nkf

2. -g オプションで文字コードを判定する

# ファイルの文字コードを判定する(-g は --guess の略) $ nkf -g sample.txt UTF-8 $ nkf -g sjis_file.txt Shift_JIS $ nkf -g euc_file.txt EUC-JP # BOM付きUTF-8の場合 $ nkf -g bom_file.txt UTF-8 (BOM)

3. 文字コードを変換する

nkf で変換する場合、出力オプションを指定します。

-w:UTF-8に変換して出力
-s:Shift_JISに変換して出力
-e:EUC-JPに変換して出力
-j:JIS(ISO-2022-JP)に変換して出力

# Shift_JIS → UTF-8 に変換して新しいファイルに保存 $ nkf -w sjis_file.txt > utf8_file.txt # EUC-JP → UTF-8 に変換して元ファイルを上書き(--overwrite) $ nkf -w --overwrite euc_file.txt # UTF-8 → Shift_JIS に変換(Windowsでの利用が必要な場合) $ nkf -s utf8_file.txt > sjis_output.txt

--overwrite オプションは元ファイルを直接書き換えます。元に戻せないので、重要なファイルはバックアップを取ってから実行してください。

4. BOM付きUTF-8を除去する

Windows環境で作成されたUTF-8ファイルにはBOM(Byte Order Mark)が付いていることがあります。BOMはLinuxのコマンドやスクリプトで予期しないエラーを引き起こすことがあります。

# BOM付きUTF-8ファイルを確認 $ nkf -g bom_file.txt UTF-8 (BOM) # BOMなしUTF-8に変換して上書き $ nkf --overwrite --oc=UTF-8 bom_file.txt # 変換後に確認 $ nkf -g bom_file.txt UTF-8

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

# カレントディレクトリ内の全 .txt ファイルをUTF-8に一括変換(上書き) $ nkf -w --overwrite *.txt # find と組み合わせてサブディレクトリも含めて一括変換 $ find /path/to/dir -name "*.txt" -exec nkf -w --overwrite {} \;

iconv コマンドで文字コードを変換する

iconv はGNU Libcに含まれる文字コード変換ツールで、追加インストールなしで利用できます。nkf が日本語特化であるのに対し、iconv は100種類以上の文字コードに対応しているため、Linuxで文字コード変換といえばまず iconv を使う場面が多いです。

1. サポートしている文字コードを確認する

# 対応している文字コードの一覧を表示する $ iconv -l # 日本語関連を絞り込む場合 $ iconv -l | grep -i utf

2. 基本的な変換の使い方

# Shift_JIS → UTF-8 に変換して出力ファイルを作成 $ iconv -f SHIFT_JIS -t UTF-8 -o output.txt input.txt # EUC-JP → UTF-8 に変換 $ iconv -f EUC-JP -t UTF-8 -o output.txt input.txt # 標準出力にリダイレクトで保存する方法(-o の代替) $ iconv -f SHIFT_JIS -t UTF-8 input.txt > output.txt

-f:変換元(from)の文字コードを指定
-t:変換先(to)の文字コードを指定
-o:出力ファイルを指定(省略すると標準出力)

3. 変換できない文字が含まれる場合の対処

変換元に変換先では表現できない文字が含まれていると、iconv はエラーで止まります。

# 変換できない文字をスキップする場合(-c オプション) $ iconv -f SHIFT_JIS -t UTF-8 -c -o output.txt input.txt # 変換できない文字を ? に置換する場合(//TRANSLIT) $ iconv -f SHIFT_JIS -t UTF-8//TRANSLIT -o output.txt input.txt # 変換できない文字を無視する場合(//IGNORE) # 注意: 終了コードが0になるため、エラーを見落とす可能性がある $ iconv -f SHIFT_JIS -t UTF-8//IGNORE -o output.txt input.txt

現場では -c オプション(変換不可文字をスキップ)が最もよく使われます。ただし、スキップされた文字は出力ファイルには含まれないため、変換後のファイルを必ず確認してください。

4. パイプラインでの活用

# Shift_JISのCSVをUTF-8に変換してgrepで検索する $ iconv -f SHIFT_JIS -t UTF-8 data.csv | grep "エラー" # Shift_JISのログファイルをUTF-8に変換しながらlessで閲覧する $ iconv -f SHIFT_JIS -t UTF-8 access.log | less # Shift_JISのファイルをUTF-8に変換してawk処理する $ iconv -f SHIFT_JIS -t UTF-8 report.csv | awk -F, '{print $1, $3}'

nkf と iconv の使い分け

用途 推奨コマンド 理由
日本語ファイルの文字コード判定 nkf -g ファイル名 JIS/Shift_JIS/EUC-JP/UTF-8の判定精度が高い
日本語ファイルの変換(JIS含む) nkf -w ファイル名 JISコードのメール等の変換が得意
一般的な文字コード変換 iconv -f 元 -t 先 -o 出力 入力 標準装備・100種類以上に対応
BOM除去 nkf --overwrite --oc=UTF-8 ファイル名 BOMを明示的に除去できる
スクリプト内での変換(依存なし) iconv GNU Libcに標準装備でインストール不要

ロケール設定と文字コードの関係

コマンドの文字コードが正しく動作するかどうかは、システムのロケール設定にも影響されます。

1. 現在のロケール設定を確認する

# 現在のロケール設定を確認する $ locale LANG=ja_JP.UTF-8 LC_CTYPE="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" ... # 利用可能なロケールを確認する $ locale -a | grep ja_JP ja_JP.eucjp ja_JP.ujis ja_JP.utf8

2. コマンド実行時にロケールを一時的に変更する

# EUC-JPロケールでコマンドを実行する場合 $ LANG=ja_JP.eucjp cat euc_file.txt # CロケールでASCII処理する場合 $ LANG=C grep "pattern" file.txt

cronで実行するスクリプト内では、LANG=ja_JP.UTF-8 を明示的に設定しないと、デフォルトの C ロケールで実行されて日本語処理が正しく動かないことがあります。cron環境でのPATH・LANG設定については、cronのトラブルシューティングを参照してください。

参照:Linux 基本コマンドの解説

文字化けのトラブルシュート

1. lessやcatで文字化けする場合

# まず文字コードを判定する $ nkf -g problem_file.txt Shift_JIS # iconv でUTF-8に変換してからlessで確認する $ iconv -f SHIFT_JIS -t UTF-8 problem_file.txt | less # または nkf でUTF-8に変換して表示する $ nkf -w problem_file.txt | less

2. grepやawkで日本語が検索・処理できない場合

# ファイルの文字コードを確認する $ nkf -g access.log EUC-JP # 処理前にUTF-8に変換する $ iconv -f EUC-JP -t UTF-8 access.log | grep "エラー" # または LANG を一時的に変更する $ LANG=ja_JP.eucjp grep "エラー" access.log

3. Shift_JISファイルがiconvで変換できない場合

# iconv でShift_JISを指定する場合、CP932やms932を試す # WindowsのShift_JISはCP932(Microsoftの拡張版)のことが多い $ iconv -f CP932 -t UTF-8 -o output.txt windows_file.txt # nkf はCP932も自動判定して変換できる $ nkf -w --overwrite windows_file.txt

Windowsが出力するShift_JISは、厳密には「CP932」(MicrosoftのShift_JIS拡張)です。iconv-f SHIFT_JIS を指定してもエラーになる場合は、-f CP932 または -f MS932 を試してください。

4. スクリプト実行時に「不正なバイト列」エラーが出る場合

# 実行例: Shift_JISのスクリプトを実行しようとしたエラー $ bash sjis_script.sh sjis_script.sh: 行 5: 予期しないトークン `$'\357\276\213'' 周辺に構文エラーあり # スクリプト本体の文字コードを確認 $ nkf -g sjis_script.sh Shift_JIS # UTF-8に変換して保存する $ nkf -w --overwrite sjis_script.sh # 変換後に実行できることを確認 $ bash sjis_script.sh

実務でのまとめ:文字コード判定・変換フロー

現場でよく使う手順を整理するとこうなります。

1. まず nkf -g ファイル名 で文字コードを判定する
2. UTF-8以外なら iconv -f 元コード -t UTF-8 -o 変換後 変換前 で変換する
3. BOM付きUTF-8なら nkf --overwrite --oc=UTF-8 ファイル名 で除去する
4. Windowsからのファイルはまず CP932 を疑う
5. スクリプト内のLANGは明示的に設定しておく

やりたいこと コマンド
文字コードを判定する(日本語) nkf -g ファイル名
文字コードを判定する(汎用) file -i ファイル名
Shift_JISをUTF-8に変換する(nkf) nkf -w sjis_file.txt > utf8_file.txt
Shift_JISをUTF-8に変換する(iconv) iconv -f SHIFT_JIS -t UTF-8 -o out.txt in.txt
EUC-JPをUTF-8に変換する iconv -f EUC-JP -t UTF-8 -o out.txt in.txt
BOM付きUTF-8のBOMを除去する nkf --overwrite --oc=UTF-8 ファイル名
複数ファイルを一括でUTF-8に変換する nkf -w --overwrite *.txt
変換しながらgrepで検索する iconv -f SHIFT_JIS -t UTF-8 ファイル名 | grep "キーワード"
ロケールの現在設定を確認する locale

関連記事

Linux ポート確認の全コマンド
Linux 基本コマンドの解説
ls コマンドの基本オプション

「Linuxサーバーを自信を持って構築・運用できる」エンジニアになりたいなら

文字コード変換・ロケール設定・ログ解析を自在に扱えると、現場でのトラブル対応スピードが一段上がります。
ネットの断片情報を寄せ集めるだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

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

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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