Linuxでの文字化けと文字コード変換

LinuxとWindowsの間でファイルをやりとりをする場合に、文字コードが問題になります。文字コードが異なれば、ファイル名やファイル内の文字が文字化けしてしまいます。文字化けを防止するには、文字コード変換をする必要があります。Linuxで文字コードを変換し、文字化けを防止する方法をまとめておきます。

ファイルの文字コードを判定する方法

文字コードを調べるには、「kcc」コマンドを使います。このコマンドは、ファイルの文字コードを指定した文字コードに変換して標準出力に出力するのですが、「-c」オプションを付けるとファイルの文字コードを表示します。実行例はつぎのとおり。

user001@debian:~$ kcc -c testfile_s-jis.txt
testfile_s-jis.txt: shift-JIS
user001@debian:~$ kcc -c testfile_euc.txt
testfile_euc.txt:   EUC
user001@debian:~$ kcc -c testfile_utf-8.txt
testfile_utf-8.txt: data

ファイルの文字コードが「shift-JIS」や「EUC」で表示されます。判別できないときは、「data」と表示されます。文字コード「UTF-8」は、判定できないようで、「data」となります。この頃は、Linux上での標準文字コードがUTF-8になってきたために「kcc」では、うまく判定できない場合が増えてきました。この場合には、「nkf」コマンドを使います。「–guess」オプションを付ければ、文字コードを調べることができます。

user001@debian:~$ nkf --guess testfile_s-jis.txt
Shift_JIS
user001@debian:~$ nkf --guess testfile_euc.txt
EUC-JP
user001@debian:~$ nkf --guess testfile_utf-8.txt
UTF-8

文字コードの変換

ファイルの文字コードを変換するには、「nkf」コマンドを使います。このコマンドは、ファイルの文字コードを自動判別するので、変更したい文字コードを指定するだけで変換できます。次の実行例では、ファイルの文字コードを「UTF-8」に変更します。

user001@debian:~$ nkf -w testfile_sjis.txt > newfilw_utf8.txt

使用できるオプションは、次の通り。

-j(省略可能)
JISコード(ISO-2022-JP)を出力をする。
-e
EUCコードを出力する。
-s
Shift-JISコードを出力する。
-w
UTF-8コードを出力する。
-Lu
改行コードをunix改行形式(LF)に変換する。
-Lw
改行コードをwindows改行形式(CRLF)に変換する。
-Lm
改行コードをmacintosh改行形式(CR)に変換する。
-g(–guess)
ファイルの文字コードを判定する。
–overwrite
変換ファイルを直接変換し、上書きする。

以上のオプションを使えば、ディレクトリ内のファイルを一括変換できたりします。例えば、Linux上で作成した文字コードUTF-8のテキストファイルをWindows用に一括変換する場合には、次のようにします。

user001@debian:~$ nkf -s Lw --overwrite *.txt

これで文字コードがShift_JIS、改行コードがwindows形式(CRLF)のテキストファイルに変換できます。

「convmv」コマンドの使い方

「convmv」コマンドは、複数のファイル名の文字コードを一度に変換できます。最近では、Debian/sargeからDebian/etchへバージョンアップしたときに、日本語ファイル名をEUCからUTF-8に文字コード変換する時に使いました。WindowsとLinuxの場合には、S-JISからUTF-8へまたは、UTF-8からS-JISへ文字コード変換すれは、文字化け解消になります。コマンドの使用例は、次のとおりです。このコマンドでは、変換対象のファイル名に「*」を指定しているので、カレントディレクトリ内の全ファイル名をS-JISからUTF-8に変換します。

convmv -r -f sjis -t utf8 * --notest

オプションについての説明は、次のとおりです。

-r
再帰的に処理をするオプションで、カレントディレクトリにディレクトリが存在すれば、そのディレクトリ内のファイル名も変換します。
-f
リネームするファイル名の文字コードを指定するオプションです。変換前のファイル名がS-JISの場合、「-f sjis」と指定します。EUCの場合は、「-f euc」とします。
-t
変換後のファイル名の文字コードを指定します。変更後の文字コードをUTF-8にするには、「-t utf8」とします。
–notest
このオプションをつけずに実行すると、実際には、変換を行わずにどのようなファイル名になるかを表示します。実際に変換する前に、変換後のファイル名を確認する時には、このオプションを付けずに実行します。

「convmv」コマンドがインストールされていない場合、Debianでは、パッケージが用意されているのでconvmvパッケージをインストールするだけでインストールされます。