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

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

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

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

Q&A

解決済

3回答

5036閲覧

PHPでCSVファイルをダウンロードした時の文字化けを解消したい

ysk1118

総合スコア22

PHP

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

0グッド

2クリップ

投稿2018/10/24 00:16

前提・実現したいこと

PHPとMYSQLを使って、あるデータ照会システムを作成しています。
DBのデータをCSVファイルでダウンロードする処理を作成しましたが、
保存されたファイルを開くと日本語部分が文字化けしています。
それ自体の原因は作成されたCSVファイルの文字コードがUTF-8形式になっているためで、
TeraPad等で、文字コードを指定して開く(Shift-JIS)と日本が表示されます。
mb_convert_encodingを用いていますが、Shift-JIS形式に変換されていないようです。
Shift-JIS形式でファイルを作成するにはどうしたらよいのでしょうか?

また、CSVファイルをShift-JISで開いても、先頭が文字化けしています。

原因・対処方法などをご教示いただけると助かります。よろしくお願いいたします。

発生している問題・エラーメッセージ

保存されたデータがUTF-8形式になり、そのまま開くと文字化けが発生しています。 【普通に開く】   ?N???u,????,?x,?Ζ±   2018-10-01,???¢???|?¨,,1   2018-10-02,???¢???|?¨,?x, Shift-JISで再読み込みすると 【Shift-JISで再読み込み】   ・ソ年月日,氏名,休,勤務    ←先頭に何か付与されている??   2018-10-01,あいうえお,,1   2018-10-02,あいうえお,休,

該当のソースコード

PHP

1$sql="select * from t_test"; 2$stmt=$pdo->prepare($sql); 3$stmt->execute(); 4 5//CSV生成 6$csvstr="年月日,氏名,休,勤務\r\n"; //見出し 7while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 8 $csvstr .= $row['年月日'] . ","; 9 $csvstr .= $row['氏名'] . ","; 10 $csvstr .= $row['休'] . ","; 11 $csvstr .= $row['勤務'] . "\r\n"; 12} 13//CSV出力 14$fileNm="data.csv"; 15header('Content-Type: text/csv'); 16header('Content-Disposition: attachment; filename=' . $fileNm); 17echo mb_convert_encoding($csvstr,"SJIS-win","UTF-8"); 18exit();

試したこと

下記URLを参考に処理を作成しました。
[https://php.programmer-reference.com/php-mysql-csv-download/]

補足情報(FW/ツールのバージョンなど)

 XAMPP for Windows 7.1.6
-Apache 2.4.25(Win32)
-PHP 7.1.6
-MySQL 15.1

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

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

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

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

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

guest

回答3

0

配列をmb_convert_variablesで文字コード変換してから出力します

PHP

1$a=["てすと","試験"]; 2print_r($a); 3mb_convert_variables("sjis","utf8",$a); 4print_r($a);

投稿2018/10/24 00:43

yambejp

総合スコア114572

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

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

ysk1118

2018/10/24 01:39 編集

mb_convert_encodingをmb_convert_variablesに置き換える、という解釈でよろしかったでしょうか? 置き換えて下記のように変更しました。 //CSV出力 $fileNm="data.csv"; header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename=' . $fileNm); //echo mb_convert_encoding($csvstr,"SJIS-win","UTF-8"); echo mb_convert_variables("sjis","utf8",$csvstr); これでダウンロードしてみたところ、ファイルの中身は  UTF-8 とだけ書かれていて、それまでの処理で変数$csvstrにセットしたデータが消えてしまっているようです。 根本的に何か理解できていないのでしょうか…。
yambejp

2018/10/24 01:43

変数を破壊的にコンバートするものなので echo mb_convert_variables("sjis","utf8",$csvstr); ではなく mb_convert_variables("sjis","utf8",$csvstr); echo $csvstr; ですね $rows = $stmt->fetchAll(PDO::FETCH_ASSOC)してから mb_convert_variables("sjis","utf8",$rows); として処理すれば良いかもしれません
ysk1118

2018/10/24 02:04

>変数を破壊的にコンバートするものなので 破壊的コンバート…どういうことなのか、少し自分で調べてみます。 取り急ぎ、下記のように処理を変更してみました。 ----------------------------------------------------------- $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); mb_convert_variables("sjis","utf8",$rows); //while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){ foreach($rows as $row){ $csvstr .= $row['年月日'] . ",";    … } echo $csvstr; ---------------------------------------------------------- 結果、中身が”UTF-8”に置き換わる、という状況では無くなりましたが、 ファイル自体は相変わらず文字化けしているという状況です。
yambejp

2018/10/24 02:14

コンバートしても文字化けしているならそれはコンバート前もしくは後のデータが 想定したキャラクターコードと違うのでは?
ysk1118

2018/10/24 03:16

ご指摘を受け、mb_convert_variablesの処理を実施した場合としなかった場合、 それぞれの場合で、$row['年月日']に対するmb_detect_encodingを実行して、 文字コードを確認したところ、  実施無し…UTF-8  実施あり…SJIS となっておりましたので、キャラクターコードは想定しているとおりだと思っています。
yambejp

2018/10/24 03:18

あとは「文字化け」とはなにを指しているのかですね エディタで開くときにキャラクターコードを指定して開いても 文字化けしますか?
ysk1118

2018/10/24 04:10

Excelやエディタ(TeraPad)で開くと、日本語(全角文字)が文字化けしている状態です。 Terapadで、文字コードを指定(Shift-JIS)して再読み込みすると、正常に日本語が表示されます。 質問本文にも記載しましたが、 URL(https://php.programmer-reference.com/php-mysql-csv-download/)を参考に、 mb_convert_encodingを用いてShift-JIS形式のファイルを作成しようとしたのですが、 実際にはUTF-8のファイルが作成され、直接開くと文字化けするのでこの問題を解決したい、 というのが最終目標です。
guest

0

自己解決

頂いたコメントに返信対応しているうちに、文字化けに関して解消できたのでこちらにて報告させていただきます。
結論としましては、最初に作成していたソースのうち、mb_convert_encodingを実施しないことで
文字化けが解消されました。

自分の中にUTF-8形式で作成されたファイルを開くと文字化けしてしまうという思い込みがあり、
なんとかファイルをShift-JIS形式にしなければ、との思いからmb_convert_encodingによる変換を
行っていましたが、これこそが文字化けの原因であったという結果でした。
(実際UTF-8形式のファイルでも、利用者環境で文字化け等起こらずに開くことができました)

UTF-8形式のファイルに、Shift-JISのデータを書き込んでいたから文字化けが起こってしまった、との
解釈に至っておりますが、誤りあればご指摘いただけると幸いです。

また、本件にご返信いただいたお二人に感謝し、本件について解決済みとさせていただきます。

投稿2018/10/24 04:48

ysk1118

総合スコア22

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

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

0

dbから、CSVってどのような方法でどの環境で行ってますか?私なら、UNIX側で行って、コマンドでutos -r
を使用して(sjisからeucは、stou)コード変換やってたのですが。あとpc側では変換する命令もあったと思います。

投稿2018/10/24 00:49

akirafudo6

総合スコア341

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

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

ysk1118

2018/10/24 01:18 編集

説明不足で申し訳ありません。 webブラウザよりボタンを押したときに該当ソースコードを実行され、 CSVファイルがダウンロードされる、という形をとっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問