WebシステムからCSVをダウンロードしてパソコンのエクセルで開く、などは業務上よく行う作業だと思います。また、エクセルで整えたCSVファイルをWebシステムにインポートする場合もありますね。このような場合に日本語文字が文字化けしてしまうのを回避する方法をご紹介します。

英語ベースのサイトでも大きなWebサービスだと日本語対応もある事が多いですが、マイナーなサービスを使っているような場合にインポート・エクスポート時の日本語文字化けを回避することができます。また、ご自身でWebサービスを運営する場合に文字化けせずにCSVを扱う方法をご紹介します。

この記事の内容


データをインポート・エクスポートする場合の文字化けのパターン

ユーザとしてWebシステムとCSVでデータをやり取りする場合、主な文字化けパターンは以下の2つです。

  • Webシステムからエクスポート (ダウンロード) したUTF-8のCSVがエクセルで文字化けする
  • エクセルで作ったCSVをWebシステムにインポート (アップロード) すると文字化けする
これはエクセルの仕組みによるものです。エクセルはCSVファイルの文字コード(エンコーディングスキーム)を日本語 Windows OS の標準である CP932(Shift_JIS)と想定しています。このため、近年 Webシステムで採用されている文字コード UTF-8 のCSVを開こうとすると文字化けするのです。

文字コード変換方法

という事で、一番単純な文字化け回避方法はダウンロードしたファイルを開く前には文字コードを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サービスを構築する