質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

10280閲覧

ajaxでphpからCSVをダウンロードする際に文字化けする

33gwky5

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2016/07/28 05:19

編集2016/07/29 03:48

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で開いた場合:ツテツスツトツ ツタツδ債ウ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanat

2016/07/28 06:16

文字化けが発生する とは具体的にはどういう状態ですか? 例えばダウンロードしたcsvをダブルクリックしてエクセルで開いたら化けている、テキストエディタで開いたら化けてるなど。 また、具体的にどんな文字列がどう化けていますか?
guest

回答1

0

ご利用のPHPの環境に"sjis-win"は本当に存在しますか?

投稿2016/07/28 05:33

yambejp

総合スコア114759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

33gwky5

2016/07/28 05:35

別の部分では問題なく使用できているのでそこが原因ではないと思います
yambejp

2016/07/28 05:55

これも関係ないかもしれませんが octet-streamでファイル名を指定してダウンロードさせるなら ajaxでやる必要ないのでは? 単にサブミットしてもページの遷移なしにダウンロードされると思いますが 「$.ajax({」のオプションで beforeSend : function(xhr) { xhr.overrideMimeType("text/plain; charset=shift_jis"); }, を指定してあげてください
yambejp

2016/07/28 05:56

ごめんなさい前回の投稿は後半部分だけ確認してください
33gwky5

2016/07/28 06:17

ご意見ありがとうございます。 beforeSendを試してみましたがExcelでの文字化けは直りませんでした。
yambejp

2016/07/28 06:23

とりあえず success: function(msg){ console.log(msg); }, で、一度問題を切り分けてみてください
33gwky5

2016/07/28 06:30

教えていただいたとおりのやり方で確認したところ、コンソールにも文字化けしていない状態のテキストが表示されました。 UTF-8で出力されてしまっているということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問