c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

エクセルで普通に開けるUnicodeなCSV

文字コード:UTF-16LE(BOM必須)
改行コード:CRLF
区切り文字:tab

出オチですが。

  • -

昨今は多言語に対応したフォームを作ってくれ、というオーダーもちらほらありますが、お客さんは管理画面からDLできるCSVをエクセルで開くわけで、何も考えて作らないとバリバリ文字化けします。
そういう時はエディタで開くとか、エクセルなんかではなくて、Open Officeとかで開くのが順当なんですがね、そんなちゃんとしたことが出来る方は滅多にいませんし。


Excelは当然ユニコード対応してるんですけど、なぜかUTF-8はちゃんと認識してくれない。
UTF-16とかいまさら誰がつかってんの(内部コード用にはよくつかわれてますけど、ファイルフォーマットとしては、UTF-8が世界的にもデファクトちゃうの?)という気がしますし、そもそもBOMがないとやっぱりコケるのが謎すぎる。
さらに、そのUTF-16にしても、カンマではなくタブがデフォルト区切り文字になるとか…

  • -

ここが本題ですが、知られてませんが、ゆるふわPHPでもUTF-16LEの取り扱いははちゃんと対応してます。
(実は案外多いですよ : http://www.php.net/manual/ja/mbstring.encodings.php

echo mb_convert_encoding($input, "UTF-16LE", "UTF-8");

ただ、上記だとBOMがつかないんですよね。
なので、エクセルで認識させるには、

echo chr(255).chr(254);//この行(BOM)は、かならずレスポンスの先頭に出力される必要がある。
echo mb_convert_encoding($input, "UTF-16LE", "UTF-8");

とする必要が有ります。
BOMは単なる特殊文字なので、ファイルの先頭2バイトに出力されていればよいですね。

  • -

ただまあ、もうOpenOfficeとかつかうべきですよね(請求書や見積もり書作成以外では)