Linuxでは、UTF-8・Shift_JIS・EUC-JPなど複数の文字コードが共存するため、適切な判定と変換ができないと作業が止まります。
この記事では、
file -i・nkf・iconv の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 で除去できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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
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
・-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
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
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:top・htop・atop・glancesでLinuxのプロセス監視を自動化する方法|ツール比較と設定例
- 前のページへ:Linuxの起動シーケンス入門|BIOS・GRUB・initramfs・systemdの流れを体系的に理解する
- この記事の属するカテゴリ:Linuxtips・テキスト処理コマンドへ戻る

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