トップへ(mam-mam.net/)

PHPで文字化けせずExcelで開けるUTF-8のCSVファイルの生成方法

検索:

~ダブルクリックでMicrosoft社Excelで文字化けせずに開けられる文字コードUTF-8のCSVファイルをPHPで生成する

普通にPHPでUTF-8のCSVファイルを生成してダウンロードしたファイルをダブルクリックしてエクセルで開くと、 文字化けして表示されてしまうので、BOM付きのCSVファイルを生成すれば、文字化けしなくなります。

UTF-8のBOM
pack('CCC',0xEF,0xBB,0xBF)
UTF-16リトルエンディアンのBOM
pack('CC',0xFF,0xFE)
UTF-16ビッグエンディアンのBOM
pack('CC',0xFE,0xFF)

※pack関数の第一引数の"C"は、符号無しChar型つまりバイト型という意味。"CCC"は符号なしChar型が3つの意味になります。

<?php
mb_internal_encoding("UTF-8");
//CSVファイルの先頭にUTF-8のBOMを付与する
$csv=pack('CCC',0xEF,0xBB,0xBF).  //UTF-8のBOM
  mb_convert_encoding(            //念のためUTF8に変換していますが文字コードが既にUTF-8の場合は不要
    '"項目","値1","値2"'."\r\n".
    '"項目1",1,2'."\r\n".
    '"項目2",2,2'."\r\n".
    '"項目3",3,5'."\r\n"
    ,"UTF-8"
  );
//ファイルサイズの取得
$filesize=strlen($csv);
//ダウンロードファイル名の設定(IEに対応するにはファイル名を文字コードShift-JISに変換する)
$filename=mb_convert_encoding("CSVファイル名.csv","SJIS","UTF-8");

header('Content-Type: application/octet-stream');
header('Content-Length: '.$filesize);
header('Content-Disposition: attachment; filename='.$filename);
echo $csv;