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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

6306閲覧

mySQL&PHPでcsvファイルを生成、Excelで開くためにSJIS-winでダウンロードした時に一部文字化けするのを防ぎたい

c5kmx9ts

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

1クリップ

投稿2016/02/02 07:06

編集2016/02/03 07:33

初めて質問いたします。

mySQL&PHPでcsvファイルを生成、Excelで開くためにSJIS-winでダウンロードした時に一部文字化けするのを防ぎたいです。

$sql = "SELECT * FROM xxxxxxxx";
$stmt = $dbh->prepare($sql);
$stmt->execute();
//CSV文字列生成
$csvstr = "項目1,項目2,住所\r\n";
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$csvstr .= $row['csv_header1'] . ",";
$csvstr .= $row['csv_header2'] . ",";
$csvstr .= $row['csv_address'] . "\r\n";
}

//CSV出力
$fileNm = "list_csv.csv";
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename='.$fileNm);
echo mb_convert_encoding($csvstr, "SJIS-win", "UTF-8");
exit();

とした時に、全体的にはしっかり出力されるのですが、一部地名に使われている「埇」が空白になってしまいます。
仮に「csv_address」に「大埇12-34」など「埇」を含む地名が入っている時にExcelで開いたcsv上では「大 12-34」のようになってしまいます。
いわゆるダメ文字なんだと思うのですが、対応の方法が分かりません。

御知恵を拝借できればと思います。
補足情報など必要に応じて追加いたします。よろしくお願いします。

※追記
Excelは比較的古いバージョンで、utf-8のcsvを読むことが出来ません。

※追記2
ブラウザで出力してみたところでは表示されています。
その上でダウンロードしたCSVファイルをExcel、テキストエディタ、googleのスプレッドシートで表示した所、Excelでは表示されない、テキストエディタ、スプレッドシートでは文字化け(嘯X2−1)、という状態でした。

※解決後の追記
この度はありがとうございました。
結果としてはmacの環境においてダメ文字の変換がうまく行かず表示されていない、という状況のようです。どの段階で失敗しているかの確認はしておりません。
mac版Excelのバージョンは2011(14.4.3)です。
windows版では問題なく表示されておりました。使用環境がwindowsですので解決とさせていただきました。

ありがとうございました。

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

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

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

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

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

guest

回答3

0

埇はWindows-31Jのコード内の文字なので化けることはないと思うんですが、
それはそもそも、DBには正しく格納されてるんでしょうか?

Excelで開くのではなくテキストエディタで開いけば正しくみられますか?

投稿2016/02/02 10:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

c5kmx9ts

2016/02/02 11:46

lucker様 ありがとうございます。 データベース内は問題なく表示されていて、テキストエディタでは 埇92-1 が 嘯X2−1 になっています。 ちなみに埇\ みたいに出力できればいいのかな、と思うのですが ?\?\?\?\?\ のようになってしまったりします。 何か手立ての情報になればいいのですが、ありがとうございます。 引き続きお願いできればと思います。
退会済みユーザー

退会済みユーザー

2016/02/02 12:32

テキストエディタで化けてるってことは、それはCSV書き出しですでにおかしいんだと思います。 とりあえず、 $row['csv_address']をUTF-8のままでブラウザに出力して確認 mb_convert_encoding($row['csv_address'], "SJIS-win", "UTF-8")してその文字列だけで確認 あたりをしてみたらいかがでしょう? Excelがどうのという問題じゃないと思います。
退会済みユーザー

退会済みユーザー

2016/02/02 12:33

あと、関係あるかないか、CSVはちゃんとダブルクオートで囲ったほうがいいですよ。
c5kmx9ts

2016/02/03 03:53

lucker様 ありがとうございます。 お返事遅くなりました。ブラウザ出力、やってみたところ、無事表示されていました!ありがとうございます。 その上でダウンロードしたCSVファイルをExcel、テキストエディタ、googleのスプレッドシートで表示した所、Excelでは表示されない、テキストエディタ、スプレッドシートでは文字化け(嘯X2−1)、という状態でした。 ダブルクォーテーション、囲ってみます。 $csvstr .= '"'.$row['csv_header1'] .'"'. ","; …ではうまく行きませんでした。こちらはほかサイトなど参考にやってみます。 引きずっておりますが引き続きお知恵をいただければと思います。 よろしくお願いします。
guest

0

ベストアンサー

なかなか解決しないようで、気になって試してみたのですが自分の環境では正常に変換してCSV出力できます。
データベースから取得の場合とHTML内に直接書いた場合のどちらも正常な結果でした。

(1) データベースから取得した場合と以下のように直接書いた場合で結果に違いはあるでしょうか?

PHP

1$str = "高知県南国市大埇乙123456\n ソニー機構美乳円弓貼付"; 2$ret = mb_convert_encoding( $str, "SJIS-win", "UTF-8"); 3header('Content-Type: text/csv'); 4header('Content-Disposition: attachment; filename=testcsv.csv'); 5print( $ret ); 6exit(); 7```結果 8```ここに言語を入力 9高知県南国市大埇乙123456 10 ソニー機構美乳円弓貼付 11```mb_convert_encoding()のシフトJISの指定を"SJIS"にすると?文字に化けますが"SJIS-win"では正常に出力されます。 12 13(2) PHPの文字コード関連の設定も確認されてはいかがでしょうか? 14以下の設定はどうなっているでしょうか?(今回は直接関係ないものもありますが。) 15```PHP 16mb_language("uni"); 17mb_internal_encoding("utf-8"); 18mb_http_input("auto"); 19mb_http_output("utf-8"); 20```(テストではWADAX WX共用サーバー使用で、HTMLファイルはUTF-8N LF 形式で保存しています) 21 22(3) CSVをブラウザ経由で出力する代わりに、サーバーのフォルダに直接fopen~fwriteで書き出してみてFTPでダウンロードした場合どうでしょうか。 23DBから取得した生データ及びmb_convert_encoding()を通したデータを別々のファイルに保存して、バイナリエディタで直接バイトデータを調べてみるとどう変換されたか判ると思います。 24 25(4) OSとブラウザが違っても結果は同じでしょうか? 26Windows7 Sp1 でIE9 と Firefox ESR 38.6.0 でテストしましたが結果は同一でした。

投稿2016/02/03 06:06

chinyato

総合スコア241

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

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

c5kmx9ts

2016/02/03 07:26

chinyato様 ありがとうございます! 無事ダウンロード、表示できました。 環境が盲点でした。 生成されたcsvをwindows(mac上のエミュレータですが)で表示した所、きちんと表示できました。 開発環境など一切書いておらず大変申し訳なかったのですが、当方macで開発しておりまして、mac版Excel、sublimetext、スプレッドシートで開いた結果文字化けしている、という状況でした。 今回の件はお客様環境がwindows、chrome最新版と決まっていますので(macで表示できないという問題は残していますが)解決したものと考えます。 開発環境の視点をいただきまして大変ありがとうございます。 ベストアンサーとさせていただきます。 また問題があれば戻ってくるかもしれませんがありがとうございました。 今後もよろしくお願いいたします。
guest

0

もしかしたら古いバージョンでは対応していないかもしれませんが、Excel 2013ではUTF-8のCSVファイル読み込みにも対応していますので、わざわざShift-JISに変換しなくても良いです。
ただし、BOMを付ける必要があります。
PHPでのやり方は判りませんが、ファイル先頭に0xEF,0xBB,0xBFを出力してからUTF-8のテキストを出力すれば良いです。

投稿2016/02/02 07:55

catsforepaw

総合スコア5938

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

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

c5kmx9ts

2016/02/02 07:58

catsforepaw様 ありがとうございます。そうなんですね。新しいやつだと良かったんですが…仰るとおり古いExcelなので、utf-8では表示できませんでした。 質問の方にExcelのバージョンを追記しておきます。 ありがとうございます!
catsforepaw

2016/02/02 08:00

そうでしたか。それは残念です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問