[PHP] 文字化けしないCSVの作り方

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

これまでシステムでCSV取り込みの処理をたくさん書いてきたが、CSV出力の要望が出てきた。
 

もちろん、想定内ではあった。だって、CSVを取り込むという事は、取り込む絡む情報などをエクセルに読み込んでデータを作りたいという意見も想定していたからだ。
 

そしてもう一つは、別システムにデータを入れ込みたい時のための受け渡し用のcsvフォーマット出力という点だ。
 

はじめはカンマ区切りのデータを出力すればいい・・・ぐらいに考えていたんだが、マルチバイトでやはり落とし穴が存在していた。

問題点

エクセルでcsvを取り込むときに、”UTF-8″では文字化けをして、”Shift-JIS”にするというのは、セオリーですが、ここでさらに問題が発生したのは、ケータイなどで入力する際に書き込める”絵文字”がShift-JISにしても正常に表示されない(いわゆる文字化け)状態になってしまいます。
 

とりあえず、以下の流れで理解してください。
 

下記のようなスマホで入力した絵文字のテキストデータを作成。
 


 

1. PHPでそのまま表示すると、問題なし


 

2. utf-8のままexcelはNG

 

ちなみに、PHPのデフォルトエンコードはUTF-8なので、想定通りエクセルで開くと文字化け。
 


 

2. 一旦shift-jisに変換

 

phpでコンバートした文字列をechoしてみると、そこでは文字化け
 


 

出力されたテキストデータ(csv)をエクセルで開くと・・・
 


 

やっぱり文字化け・・・
&nbsp

どうやらBOB付きのデータにしないといけないようだ・・・
 

3. BOMをつけてコンバート

 

“pack(‘C*’,0xEF,0xBB,0xBF)”の箇所がBOMのバイナリコードになっていて、ファイルの開始に付与する書き方です。
BOMというのは、UTF-8の機能なので、ここではshift-jisに変換する必要がありません。
 


 

でもこれも文字化けです。先頭にゴミみたいなものBOMが付いているのが確認できます。
 

そして、ググっていると、どうやらmacとwindowsのexcelでは、文字エンコードが違うようで、Mac用のコンバートをしなければいけないことがわかりました。
 

4. mac専用エンコード変換

 

いよいよ大詰めです。BOMコードも先ほどと少し違っているし、そもそも”UTF-16LE”という使ったことのないエンコードタイプに変換しないといけないようです。
 


 

ようやく表示されました。
まだ若干文字化けしているのは、カラム認識が正常にできていないので、ちゃんとcsvフォーマットを意識してデータ作成をしなければいけないようです。
 

でも、これで成功?
ちなみに、office365で開いてみると、全然文字化けでした・・・orz
 

想定できるCSVのデータパターン数

今回macのExcelアプリで開くという条件は達成できましたが、WEBサービスとして不特定多数のユーザーを相手にするとしたら、この状態ではまずいです。
 

とりあえず、絵文字を使わなければshift-jisにするだけで問題はないのですが、絵文字を使われてしまうと、windows用とmac用にデータ出力を分けなければいけません。
 

なので、以下のパターンが必要になります。
 

1. BOM無し Shift-jis
2. BOM有り Windows-csv
3. BOM有り Mac-csv

 

CSVって、なかなかのめんどくささですね。
そもそもBOMってなんなんだよ!

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です