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

2019年1月17日

PHP テクノロジー プログラミング

これまでシステムでCSV取り込みの処理をたくさん書いてきたが、CSV出力の要望が出てきた。 もちろん、想定内ではあった。だって、CSVを取り込むという事は、取り込む絡む情報などをエクセルに読み込んでデータを作りたいという意見も想定していたからだ。 そしてもう一つは、別システムにデータを入れ込みたい時のための受け渡し用のcsvフォーマット出力という点だ。 はじめはカンマ区切りのデータを出力すればいい・・・ぐらいに考えていたんだが、マルチバイトでやはり落とし穴が存在していた。

問題点

エクセルでcsvを取り込むときに、"UTF-8"では文字化けをして、"Shift-JIS"にするというのは、セオリーですが、ここでさらに問題が発生したのは、ケータイなどで入力する際に書き込める"絵文字"がShift-JISにしても正常に表示されない(いわゆる文字化け)状態になってしまいます。 とりあえず、以下の流れで理解してください。 下記のようなスマホで入力した絵文字のテキストデータを作成。

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

2. utf-8のままexcelはNG

<?php $txt = file_get_contents("emoji.txt"); file_put_contents("emoji.csv" , "1,".$txt); echo $txt; ちなみに、PHPのデフォルトエンコードはUTF-8なので、想定通りエクセルで開くと文字化け。

2. 一旦shift-jisに変換

<?php $txt = file_get_contents("emoji.txt"); $txt2 = mb_convert_encoding($txt , "UTF-8" , "SJIS"); file_put_contents("emoji.csv" , "1,".$txt2); echo $txt; phpでコンバートした文字列をechoしてみると、そこでは文字化け 出力されたテキストデータ(csv)をエクセルで開くと・・・ やっぱり文字化け・・・ どうやらBOB付きのデータにしないといけないようだ・・・

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

<?php $txt = file_get_contents("emoji.txt"); $txt2 = pack('C*',0xEF,0xBB,0xBF). $txt; file_put_contents("emoji-3.csv" , $txt2); echo $txt2; "pack('C*',0xEF,0xBB,0xBF)"の箇所がBOMのバイナリコードになっていて、ファイルの開始に付与する書き方です。 BOMというのは、UTF-8の機能なので、ここではshift-jisに変換する必要がありません。 でもこれも文字化けです。先頭にゴミみたいなものBOMが付いているのが確認できます。 そして、ググっていると、どうやらmacとwindowsのexcelでは、文字エンコードが違うようで、Mac用のコンバートをしなければいけないことがわかりました。

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

<?php $txt = file_get_contents("emoji.txt"); $txt2 = pack('C*',0xFE,0xFF). mb_convert_encoding("1,".$txt, 'UTF-16LE', 'UTF-8'); file_put_contents("emoji04.csv" , $txt2); echo $txt2; いよいよ大詰めです。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ってなんなんだよ!

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。