Hatena::ブログ(Diary)

c/fe

2011-08-02

エクセルで普通に開ける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とかつかうべきですよね(請求書や見積もり書作成以外では)

名無し名無し 2014/01/17 21:22 ありがとうございます。ありがとうございます。
本当に助かりました。とてもわかりやすいご説明ありがとうございます!!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/uzulla/20110802/p1