英語ベースのサイトでも大きなWebサービスだと日本語対応もある事が多いですが、マイナーなサービスを使っているような場合にインポート・エクスポート時の日本語文字化けを回避することができます。また、ご自身でWebサービスを運営する場合に文字化けせずにCSVを扱う方法をご紹介します。
この記事の内容
- 文字化けするCSVの変換方法(Perl を利用)
- 文字化けしないCSVの作り方(Perl を利用)
- Perl の使い方(別記事)
- 文字化けしない Web サービスの構築方法
データをインポート・エクスポートする場合の文字化けのパターン
ユーザとしてWebシステムとCSVでデータをやり取りする場合、主な文字化けパターンは以下の2つです。- Webシステムからエクスポート (ダウンロード) したUTF-8のCSVがエクセルで文字化けする
- エクセルで作ったCSVをWebシステムにインポート (アップロード) すると文字化けする
文字コード変換方法
という事で、一番単純な文字化け回避方法はダウンロードしたファイルを開く前には文字コードをCP932に、アップロードする前にはUTF-8に変換する事です。この変換は以下の1行コマンドで行えます。ちなみに、このような1行コマンドを「ワンライナー」と呼びます。Perlの得意とする所です。
CP932 から UTF-8 に変換
perl -npi.bak -MEncode -e 'Encode::from_to($_, "cp932", "utf8")' (ファイル名)
UTF-8 から CP932 に変換
perl -npi.bak -MEncode -e 'Encode::from_to($_, "utf8", "cp932")' (ファイル名)
残る文字化け問題
さてこれでめでたし...と言いたい所ですが、実は少し問題があります。CP932 から UTF-8 の変換は問題ないのですが、UTF-8 から CP932 への変換は、一部の文字が文字化けします。文字化けする文字は、Unicode (UTF-8) にしかない「つちよし」などの特殊文字の他、人名に使う「はしごだか」など、CP932 でも対応している文字も含みます。CP932にもある文字が文字化けする原因は CP932 の仕様の複雑さと Perl のバージョンの組み合わせに拠るものです。つまり、他のデスクトップアプリケーションなどで文字コードを変更した時には起きない文字化けが、最近のバージョンのPerl の標準モジュール Encode を使うと起きてしまうという事です。これはあまり面白く無いですよね? という事で、この問題の起きる「UTF-8 から CP932 に変換」は止めて、代わりにエクセルで開けるUTF-8のCSVファイルを作る事にしましょう。
エクセルは UTF-8 の「はしごだか」を CP932 の「はしごだか」に文字化けせずに変換する機能を備えているので、開く時にファイルが UTF-8 である事を教えてやれば、一旦ファイルを開いた後にShift_JISで保存されたとしてもこれらの文字の文字化けは起きません。ただし、Unicode (UTF-8) にしかない「つちよし」などの特殊文字はやはり文字化けします。
エクセルで文字化けしない UTF-8 の CSV を作る方法
エクセルで文字化けせずに開ける UTF-8 の CSV を作る方法は簡単です。ファイルの先頭に「BOM (ボム、Byte Order Mark) 」と呼ばれる記号を追加してやれば、エクセルはそのファイルの文字コードがUTF-8である事を認識してくれるので、文字化けせずにファイルを開く事ができます。BOMを先頭に挿入するには、以下のコマンドを実行します。
ファイルの先頭にBOMを挿入
perl -0777 -npi.bak -e 's/\A(?:\xef\xbb\xbf)?/\xef\xbb\xbf/' (ファイル名)>次は:文字化けしないようにWebサービスを構築する