Windowsで作ったファイルをLinuxサーバーへ転送した途端、日本語が読めない記号の羅列に変わってしまう——Linuxを使い始めた頃、誰もが一度は遭遇するトラブルです。
この記事では、Linuxの文字コード(ロケール設定・文字コード確認・変換方法)を体系的に解説します。
UTF-8とShift-JISの違い、iconvとnkfコマンドによる変換手順、RHEL9/Rocky Linux9でのロケール設定まで、現場で使える知識を網羅しています。
この記事のポイント
・Linuxの標準文字コードはUTF-8。日本語環境ではja_JP.UTF-8が基本
・fileコマンドで文字コードを確認し、iconvかnkfで変換できる
・RHEL9/Rocky9のロケール設定はlocalectlコマンドを使う
・変換時は必ずバックアップを取ること。元ファイルを上書きしない
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Linuxの文字コードとは?主要な種類と違い
文字コードとは、文字と数値を対応させたルールのことです。コンピューターは文字をそのまま扱えないため、「A = 65」のように数値に変換して処理します。
問題は、このルールが複数存在することで、異なるルールで書かれたファイルを開くと文字化けが発生します。
Linux環境で知っておくべき主要な文字コードは以下の通りです。
| 文字コード | 特徴 | 主な用途 |
|---|---|---|
| ASCII | 7ビットで128種類(英数字・記号) | 英語圏の基本文字 |
| ISO-8859-1 | ASCIIを8ビットに拡張(256種類) | 西欧語(ドイツ語・フランス語等) |
| EUC-JP(日本語EUC) | UNIXで標準的な日本語文字コード | 旧来のLinux・UNIXシステム |
| Shift-JIS(SJIS) | Windowsの標準日本語文字コード | Windows/Excelで作成したファイル |
| UTF-8 | Unicodeを1~4バイトで可変長エンコード | 現代のLinux標準、Webの世界標準 |
現在のLinuxディストリビューション(RHEL9、Rocky Linux 9、Ubuntu 24.04など)はデフォルトでUTF-8を採用しています。
文字化けが起きる主な原因は、Windowsで作成したShift-JISのファイルをUTF-8環境のLinuxで開く場合です。
fileコマンドで文字コードを確認する
変換する前に、対象ファイルの現在の文字コードを確認することが重要です。fileコマンドの
-iオプションを使うと、MIMEタイプと文字エンコーディングを表示できます。1. fileコマンドの基本構文
# 書式 file -i ファイル名 # UTF-8ファイルの確認例 $ file -i sample.txt sample.txt: text/plain; charset=utf-8 # Shift-JISファイルの確認例 $ file -i windows_data.csv windows_data.csv: text/plain; charset=iso-8859-1
fileコマンドはファイルの冒頭部分を解析して推定するため、Shift-JISはiso-8859-1と判定されることがあります。charset=utf-8と表示されていれば確実にUTF-8ですが、それ以外は
nkf --guessでも確認するとより確実です。2. nkf --guessで文字コードを正確に判定する
# nkfをインストール(RHEL9/Rocky9の場合) $ sudo dnf install nkf -y # 文字コードを判定する $ nkf --guess windows_data.csv Shift_JIS $ nkf --guess linux_file.txt UTF-8
fileコマンドより精度が高いです。Shift-JIS / EUC-JP / UTF-8の判別に特に有効です。
iconvコマンドで文字コードを変換する
iconvは多くのLinuxディストリビューションに標準搭載されている文字コード変換コマンドです。1. iconvコマンドの書式とオプション
| オプション | 意味 |
|---|---|
| -f 入力文字コード | 変換前の文字コードを指定 |
| -t 出力文字コード | 変換後の文字コードを指定 |
| -o 出力ファイル | 変換結果を別ファイルに保存(元ファイルを上書きしない) |
| -l | 対応している文字コードの一覧を表示 |
| -c | 変換できない文字をスキップ(エラー回避) |
2. Shift-JISからUTF-8へ変換する(基本例)
# Shift-JIS(sjis)からUTF-8(utf8)に変換 # -o オプションで出力ファイルを別名指定(元ファイル保護) $ iconv -f sjis -t utf8 windows_data.csv -o windows_data_utf8.csv # 変換後の文字コードを確認 $ nkf --guess windows_data_utf8.csv UTF-8 # 変換前後のファイルを比較確認 $ wc -l windows_data.csv windows_data_utf8.csv 100 windows_data.csv 100 windows_data_utf8.csv
iconv -f sjis -t utf8 data.csv > data.csvとすると、ファイルが空になります。必ず
-oオプションか、別のファイル名でリダイレクトしてください。3. EUC-JPからUTF-8へ変換する
# EUC-JPからUTF-8に変換 $ iconv -f eucjp -t utf8 old_unix_file.txt -o old_unix_file_utf8.txt # UTF-8からEUC-JPに変換(古いシステムへの対応が必要な場合) $ iconv -f utf8 -t eucjp modern_file.txt -o legacy_file.txt
4. 対応文字コードの一覧を確認する
# iconvが扱える文字コードを一覧表示 $ iconv -l | grep -i -E "sjis|shift|euc|utf|iso-8859" ISO-8859-1// ISO-8859-15// EUC-JP// SHIFT_JIS// UTF-8// UTF-16// UTF-32//
nkfコマンドで文字コードを変換する
nkf(Network Kanji Filter)は日本語処理に特化した変換ツールです。iconvより日本語の判定・変換精度が高く、改行コードの変換も同時に行える点が便利です。
1. nkfコマンドの主要オプション
| オプション | 意味 |
|---|---|
| -w | UTF-8で出力 |
| -s | Shift-JISで出力 |
| -e | EUC-JPで出力 |
| -Lu | 改行コードをUnix形式(LF)に変換 |
| -Lw | 改行コードをWindows形式(CRLF)に変換 |
| --guess | 文字コードを判定して表示(変換しない) |
| --overwrite | 元ファイルを直接上書き(注意して使用) |
2. Shift-JISファイルをUTF-8に変換する(nkf使用)
# Shift-JISをUTF-8に変換(出力は別ファイルへリダイレクト) $ nkf -w windows_data.csv > windows_data_utf8.csv # 改行コードもUnix形式(LF)に同時変換 $ nkf -w -Lu windows_data.csv > windows_data_utf8.csv # 変換結果を確認 $ nkf --guess windows_data_utf8.csv UTF-8 $ file windows_data_utf8.csv windows_data_utf8.csv: UTF-8 Unicode text
3. 複数ファイルを一括変換する
# ディレクトリ内の全.txtファイルをUTF-8に一括変換 # (--overwriteは元ファイルを上書きするため、事前にバックアップすること) $ cp -r /data/sjis_files /data/sjis_files_backup $ find /data/sjis_files -name "*.txt" -exec nkf -w --overwrite {} \; # 変換後に確認 $ nkf --guess /data/sjis_files/sample.txt UTF-8
--overwriteは元ファイルを直接書き換えます。必ず
cp -rでバックアップを取ってから実行してください。localeコマンドでロケール設定を確認する
Linuxの言語環境(ロケール)の設定が文字化けに影響することがあります。ロケールとは、言語・文字コード・通貨・日付形式などの地域設定をまとめたものです。
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" LC_COLLATE="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_PAPER="ja_JP.UTF-8" LC_NAME="ja_JP.UTF-8" LC_ADDRESS="ja_JP.UTF-8" LC_TELEPHONE="ja_JP.UTF-8" LC_MEASUREMENT="ja_JP.UTF-8" LC_IDENTIFICATION="ja_JP.UTF-8" LC_ALL= # インストール済みのロケールを確認 $ locale -a | grep -i japan ja_JP.eucjp ja_JP.utf8
2. cronや自動化スクリプトでLANG設定が重要な理由
cronジョブ(定期実行スクリプト)では、シェルの環境変数が引き継がれないため、日本語を扱うスクリプトで文字化けが発生することがあります。
# cronスクリプトの冒頭に必ず記述する #!/bin/bash export LANG=ja_JP.UTF-8 export LC_ALL=ja_JP.UTF-8 # これがないと日本語ファイル名の処理や出力が文字化けする
RHEL9 / Rocky Linux9でのロケール設定変更
RHEL9やRocky Linux 9では、localectlコマンドを使ってロケールを設定します。1. localectlで日本語ロケールに設定する
# 現在のシステムロケールを確認 $ localectl status System Locale: LANG=en_US.UTF-8 VC Keymap: us X11 Layout: us # 日本語UTF-8ロケールに変更 $ sudo localectl set-locale LANG=ja_JP.UTF-8 # 設定後に確認 $ localectl status System Locale: LANG=ja_JP.UTF-8 VC Keymap: us X11 Layout: us # 変更を反映するため、ログアウト&再ログインするか下記を実行 $ source /etc/locale.conf
2. 日本語ロケールパッケージのインストール
# 日本語ロケールが未インストールの場合 $ sudo dnf install glibc-langpack-ja -y # インストール後に確認 $ locale -a | grep ja ja_JP.eucjp ja_JP.utf8
よくあるトラブルと対処法
1. iconvで「変換できない文字がある」エラーが出る
# エラー例 $ iconv -f sjis -t utf8 data.csv -o data_utf8.csv iconv: data.csv:156:45: cannot convert # 対処: -c オプションで変換できない文字をスキップ $ iconv -f sjis -t utf8 -c data.csv -o data_utf8.csv # または -t に //IGNORE または //TRANSLIT を付ける $ iconv -f sjis -t utf8//IGNORE data.csv -o data_utf8.csv
-cや//IGNOREを使うと、変換できない文字が無視されてデータが欠損する場合があります。重要なファイルの場合は、欠損を確認してから本番環境で使用してください。
2. シェルスクリプトで日本語ファイル名が処理できない
# スクリプト冒頭にLANG設定を明示する #!/bin/bash export LANG=ja_JP.UTF-8 # ファイル名に日本語が含まれる場合の確認 $ ls -la *.txt -rw-r--r--. 1 ec2-user ec2-user 1234 Apr 7 10:00 テスト.txt
3. catコマンドで文字化けする
# Shift-JISファイルをUTF-8環境のターミナルで表示する場合 # そのままcatすると文字化けする $ cat windows_file.txt ??????????? # nkfで変換しながら表示する $ nkf -w windows_file.txt | cat # または一時ファイルに変換してから確認 $ nkf -w windows_file.txt > /tmp/check.txt && cat /tmp/check.txt
4. GrepやSedで日本語が一致しない
# 日本語パターンでgrepが失敗する場合 $ grep "テスト" data.txt (何も表示されない) # LANG設定を確認してから再実行 $ echo $LANG C $ export LANG=ja_JP.UTF-8 $ grep "テスト" data.txt テストデータ: 123
CやPOSIXに設定されていると、マルチバイト文字の処理が正しく行われません。本記事のまとめ
| 操作 | コマンド | 用途 |
|---|---|---|
| 文字コード確認(簡易) | file -i ファイル名 |
MIMEタイプと文字コードを確認 |
| 文字コード確認(高精度) | nkf --guess ファイル名 |
日本語文字コードの正確な判定 |
| 文字コード変換(汎用) | iconv -f 入力コード -t 出力コード |
多様な文字コード間の変換 |
| 文字コード変換(日本語特化) | nkf -w / -s / -e |
日本語+改行コードを同時変換 |
| ロケール確認 | locale |
現在の言語・文字コード設定を確認 |
| ロケール変更(RHEL9) | sudo localectl set-locale LANG=ja_JP.UTF-8 |
システム全体のロケールを変更 |
現場での文字化け対処の基本は「まず文字コードを確認してから変換する」です。
nkf --guessで判定 → iconvかnkfで変換 → 変換後に再度確認するという3ステップを習慣にしてください。また、cronスクリプトや自動化処理では
LANG=ja_JP.UTF-8の明示的な設定を忘れないことが、文字化けトラブルを防ぐ鉄則です。
Linuxの文字コード・ロケール設定を現場レベルで使いこなしたい方へ
文字コードの仕組みを理解することは、Linuxサーバー運用の基礎です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
