ajaxでphpからExcelで開けるようなCSV(Shift-JIS)をダウンロードしたいのですが、文字化けが発生してしまいます。
csvダウンロード中にインジケーターを表示させたいため、ajaxという部分は変えずに文字化けを解消したいと考えています。
どのようにすれば改善できるでしょうか?
ファイルダウンロード部分はこちらを参考にさせていただきました(ほぼコピペです)
javascript
1$.ajax({ 2 type: 'POST', 3 url: 'csv.php', 4 data : /*--サーバーに送るデータ--*/, 5 dataType : 'text', 6//-----------------------------コメントで教えていただき修正しました 7 beforeSend : function(xhr) { 8 xhr.overrideMimeType("text/plain; charset=shift_jis"); 9 }, 10//------------------------------ここまで 11 success: function(data, textStatus, xhr) { 12 if(data!=""){ 13 let downloadData = new Blob([data], {type: 'text/csv'}); 14 let filename = "test.csv"; 15 16 if (window.navigator.msSaveBlob) { 17 window.navigator.msSaveBlob(downloadData, filename); 18 } else { 19 let downloadUrl = (window.URL || window.webkitURL).createObjectURL(downloadData); 20 let link = document.createElement('a'); 21 link.href = downloadUrl; 22 link.download = filename; 23 link.click(); 24 (window.URL || window.webkitURL).revokeObjectURL(downloadUrl); 25 } 26 } 27 }, 28 error: function(xhr, textStatus, errorThrown){ 29 //エラー処理 30 } 31});
php
1/*DBからデータを取得し配列の形で$resultに入れる*/ 2$csv=""; 3 foreach ($result as $key1=>$value1){ 4 foreach ($value1 as $key2=>$value2){ 5 $csv.="\"".$value2."\","; 6 } 7 $csv.="\n"; 8 } 9 10 header("Content-Type: application/octet-stream"); 11 header("Content-Disposition: attachment; filename={$filename}"); 12 13 $csv = mb_convert_encoding ( $csv, "sjis-win" , 'utf-8' ); 14 15 echo $csv;
追記
先ほどコメントで教えていただいたbeforeSendを適用する以前はテキストエディタでも文字化けが発生していたのですが、修正してからはテキストエディタでは問題なく読めるようになりました。
現在発生している文字化けは以下のとおりです。
元のテキスト:テスト タロウ
Excelで開いた場合:繝・せ繝医繝上リ繧ウ
追記2
テキストエディタでは問題なく開けることから、UTF-8で出力されているのではないかと予測し、javascript側でEncoding.jsを利用しShift-JISへの変換を試みましたが文字化けが発生してしまいました。何が原因なのでしょうか。
元のテキスト:テスト タロウ
Excelで開いた場合:ツテツスツトツ ツタツδ債ウ