文字コードの変換
Linux環境では、ファイル内容の文字コード変換にnkf、ファイル名の文字コード変換にconvmvを使う。nkfは入力文字コードを自動判別し、多様なエンコーディングに変換する。convmvは既定で変換内容を表示するだけであり、実際にファイル名を変更するには--notestオプションが必要である。
文字コードの変換は、異なる環境間でファイルをやり取りするときに必要になる。Ubuntu 24.04 LTS では、nkf と convmv がパッケージとして提供されている。次のコマンドでインストールする。
sudo apt -y install nkf convmv
nkf を使う場合
ファイルの内容の文字コードを変換するには、nkf コマンドを使う。nkf は入力の文字コードを自動判別する機能を持ち、入力文字コードを指定しなくても変換できることが多い。出力する文字コードはオプションで指定する。ISO-2022-JP、Shift_JIS、EUC-JP、UTF-8 のほか、UTF-16 や UTF-32 にも対応している。
変換前に文字コードを確認するには、nkf --guess ファイル名 を実行する。判別結果の文字コードと改行コードが表示される。
nkf は変換結果を標準出力に出力する。nkf -w ファイル名 のようにリダイレクトを使わずに実行すれば、変換結果を画面で確認できる。
- nkf -w: UTF-8 に変換して標準出力に出力する。Shift_JIS のファイルを UTF-8 に変換するには、次のように実行する。
nkf -w sjis_file.txt > utf8_file.txt - nkf -s: Shift_JIS に変換して標準出力に出力する。
nkf -s utf8_file.txt > sjis_file.txt - nkf -j: ISO-2022-JP(JISコード)に変換して標準出力に出力する。
nkf -j file.txt > jis_file.txt - nkf -e: EUC-JP に変換して標準出力に出力する。
nkf -e file.txt > euc_file.txt - nkf -x: nkf は既定で半角カナ(JIS X 0201 かな)を全角カナ(JIS X 0208)に変換する。-x を付けると、半角カナを変換せずそのまま出力する。文字コード変換のオプションと組み合わせて使う。半角カナを含む Shift_JIS のファイルを、半角カナのまま UTF-8 に変換するには、次のように実行する。
半角カナを全角カナに変換したい場合は、-x を付けずに実行する。nkf -w -x hankaku_file.txt > utf8_file.txt
nkf -w hankaku_file.txt > zenkaku_utf8_file.txt - nkf --overwrite: 変換結果で元のファイルを上書きする。元のファイルのタイムスタンプは保持される。
nkf -w --overwrite file.txt - 複数のファイルをまとめて処理するには、find と xargs を組み合わせる。カレントディレクトリ以下のすべての .txt ファイルを UTF-8 に変換して上書きするには、次のように実行する。ファイル名に空白が含まれる場合に備えて、-print0 と -0 を使う。
find . -type f -name "*.txt" -print0 | xargs -0 nkf -w --overwrite
convmv を使う場合
ファイル名の文字コードを変換するには、convmv コマンドを使う。convmv が変換するのはファイル名であり、ファイルの内容は変換しない。convmv は既定では変換の内容を表示するだけである。実際にファイル名を変更するには --notest オプションを指定する。まず --notest を付けずに実行して結果を確認し、問題がなければ --notest を付けて実行する。
変換元の文字コードは -f、変換先の文字コードは -t で指定する。ディレクトリ内のファイル名をまとめて変換するには、-r(再帰的に処理)を指定する。利用できる文字コードの一覧は convmv --list で表示される。
- CP932(Windows で使われる Shift_JIS 系の文字コード)のファイル名を UTF-8 に変換する。まず、変換内容を確認する。
実際に変換する場合は、次のように実行する。convmv -f cp932 -t utf-8 ファイル名.txt
ディレクトリ以下のファイル名をまとめて変換する場合は、次のように実行する。convmv -f cp932 -t utf-8 --notest ファイル名.txt
convmv -f cp932 -t utf-8 -r --notest ディレクトリ名/ - UTF-8 のファイル名を CP932 に変換する。まず、変換内容を確認する。
実際に変換する場合は、次のように実行する。convmv -f utf-8 -t cp932 ファイル名.txt
convmv -f utf-8 -t cp932 --notest ファイル名.txt
UTF-8 への変換では、convmv はすでに UTF-8 になっているファイル名を判別し、そのファイルを処理の対象から外す。この判別を行わせずに変換するには --nosmart を指定するが、二重に UTF-8 に変換されたファイル名になることがある。