Linuxの文字コードを理解する|確認・変換・ロケール設定まで完全解説


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)【Linux入門】初心者のための基礎知識・講座 > Linuxの文字コードを理解する|確認・変換・ロケール設定まで完全解説
「このファイル、Linuxで開いたら文字化けした」という経験はありませんか?
Windowsで作ったファイルをLinuxサーバーへ転送した途端、日本語が読めない記号の羅列に変わってしまう——Linuxを使い始めた頃、誰もが一度は遭遇するトラブルです。

この記事では、Linuxの文字コード(ロケール設定・文字コード確認・変換方法)を体系的に解説します。
UTF-8とShift-JISの違い、iconvnkfコマンドによる変換手順、RHEL9/Rocky Linux9でのロケール設定まで、現場で使える知識を網羅しています。

この記事のポイント

・Linuxの標準文字コードはUTF-8。日本語環境ではja_JP.UTF-8が基本
・fileコマンドで文字コードを確認し、iconvかnkfで変換できる
・RHEL9/Rocky9のロケール設定はlocalectlコマンドを使う
・変換時は必ずバックアップを取ること。元ファイルを上書きしない


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

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

nkf --guessはファイル全体を解析するため、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

LANG=ja_JP.UTF-8が設定されていれば、日本語UTF-8環境として正しく動作しています。

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

LANGがCPOSIXに設定されていると、マルチバイト文字の処理が正しく行われません。

本記事のまとめ

操作 コマンド 用途
文字コード確認(簡易) 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で判定 → iconvnkfで変換 → 変換後に再度確認するという3ステップを習慣にしてください。

また、cronスクリプトや自動化処理ではLANG=ja_JP.UTF-8の明示的な設定を忘れないことが、文字化けトラブルを防ぐ鉄則です。

Linuxの文字コード・ロケール設定を現場レベルで使いこなしたい方へ

文字コードの仕組みを理解することは、Linuxサーバー運用の基礎です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。

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


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

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

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

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

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

宮崎 智広

この記事を書いた人

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

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

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