文字エンコードを変換する

お題はありふれたもので、いろいろなブログで語られているものです。
実際の作業では、足りない点もあるので、補足するメモです。

ここでの紹介は、

半角カタカナが全角カタカナになる
・"~"が一致しない文字コードになる
・文字エンコードが混在している
といったときの対処メモです。

目的

マルチプラットフォームで開発していると、ソースコードの文字エンコードが統一されず、困ることがあります。

実際に統一する場合、UTF-8 BOM付きになることが多いと思います。
理由は、BOMが付くことでファイルフォーマットが確定すること。
バイト文字が使えること。
多くの開発ツールがサポートしていること。

などが挙げられます。

 文字エンコードの知識

文字エンコード変換で一番困るのが、Windows上のShiftJIS日本語入りのソースコードUTF-8(BOM)に変換する場合です。
Windwosで作ったShiftJISファイルはCP932と呼ばれるShiftJISの亜種みたいなもので、ISO規格のShiftJIS=ISO-2022-JPと違います。
CP932をISO-2022-JPとして変換すると、半角カタカナが全角になったり、"~"が一致しない文字コードになったりします。

変換ツール

変換ツールは、"nkf"を使います。
Linuxですが、機能が使いやすいです。
WindwosからはVM経由の共有フォルダで、Windwos上のファイルを変換できますので、LinuxがゲストOSのVMを使います。(cgwinでもいいですよ)

コマンド

Windwos用のShiftJISファイルをUTF-8 BOM付きにするコマンド。

nkf --ic=CP932 --oc=UTF-8-BOM --overwrite filename

ファイルがわかっている場合や少ない場合は、これでいいです。
半角カタカナが全角カタカナになる
・"~"が一致しない文字コードになる
が解決します。

 

ファイルが多い場合や、一部のファイルがUTF-8だった場合はどうでしょう。

--ic=932 は「入力ファイルは、CP932形式ですよ」と教えているのに、実際のファイルがUTF-8だったら変換後のファイルは文字化けしてしまいます。

--ic を省略すると入力ファイルを自動で解釈してくれまが、ShiftJISファイルを自動解釈するとISO-2022-JPで解釈されるので、半角カタカナ問題を解決できません。

そこで、全ファイルをまずCP932にしちゃいます。

find . -type f | xargs nkf --oc=CP932 --overwrite

次に、UTF-8 BOM付きに変換です。

find . -type f | xargs nkf --ic=CP932 --oc=UTF-8-BOM --overwrite

2回に分けているのは、UTF-8依存文字が欠落するので、差分を取って後で直せるようにしています。--overwriteで上書きしているのでコピーを忘れずに。

・文字エンコードが混在している
の解決方法でした。

ついでに

解決できない問題。
・CP932をUTF-8ISO-2022-JPで誤変換したファイルを元ファイルに戻したい

CP932は半角・全角カタカナが混在しますが、ISO-2022-JPUTF-8に変換すると、どちらも全角カタカナになります。
その後、UTF-8からCP932にしようとしても、元のファイルが半角だったか全角だったか情報がなくなっているので、戻すことはできません。