日本語と中国語が混在するCSVファイルの作り方(文字化け対策)

今週ブログ当番のkkです。

今回のブログのテーマをずっと考えてました。
何を書こうか、毎回困ります。

と思っていたら、ちょうど昨日、開発中のCSV出力機能で文字化けが発生しました。
image01

じゃ、テーマはこれだ!\(^o^)/

【文字化けの原因】

  • Q:何で文字化けが起きたか?
    A:出力するCSVファイルに、日本語と中国語が混在していた。中国語について、日本語に存在しない漢字が「?」と表示される。
  • Q:ブラウザは日本語と中国語も混在するのに、何で文字化けしないか?
    image06
    A:ブラウザで表示する際の文字コードはUTF-8にしている。一方、CSVファイルの文字コードはMS93にしていた。
  • Q:CSVファイルの文字コードにUTF-8を使わないの理由は?
    A:CSVファイルの文字コードを普通にUTF-8にしても、Microsoft Excelで開けない為。
    UTF-8のCSVファイルをExcelで開と、日本語が文字化けします。
    image02

MS932はMicrosoftコードページ932のことです。これは、Shift_JISをMicrosoftが独自に拡張した文字コードです。(wiki:MS932
MS932は日本語と英語しか対応していない為、中国語を含めることができません。

【解決策】

ExcelでUTF-8を使える方法がないか調べたところ、「BOM付きUTF-8」のCSVファイルならば、文字化けすることなくExcelで開けることがわかりました。

BOMとは「Byte Order Mark」のことで、Unicodeであることを明示する為にUTF-8のファイルの先頭に付与されることがあるそうです。

Javaでは次のように記述すると、BOM付きのUTF-8ファイルを作成することができます。

        try {
            ServletOutputStream os = response.getOutputStream();
            os.write(0xef);
            os.write(0xbb);
            os.write(0xbf);
            result = new OutputStreamWriter(os, "UTF-8");
        } catch (IOException e) {}

上記プログラムで作成したCSVファイルをテキストエディタで開くと、右下に「UTF-8(BOM付き)」が表示されました。
image03

Excelで開いても、文字化けしなくなりました。
image04

以上、簡単ですが、国際化対応のCSVファイルの作成方法でした。