こんばんは。お世話になっております。
題名にある「配列データをCSVで・・」に関して、2つほど質問があり投稿させていただきます。
ヤフーのAPIを利用しているのですが(テストしている段階)、検索結果は提供されたデータが配列に格納されており、それを展開して検索結果として出力しています。
と、ここで、その結果をCSVでダウンロードすべく、配列データをimplodeで配列に収めて別ファイルにGETで渡し、渡されたデータをexplodeで配列に戻し、
header("Pragma: cache;");
Header("Content-type:application/vnd.ms-excel; charset=Shift_JIS");
header("Content-Disposition: inline; filename=$fname.csv");//ファイル名は一意な名前にしています。
$csv_line = implode("\n", $items);
print(mb_convert_encoding($csv_line, "SJIS", "UTF-8"));
と、やっております。
そこで質問なのですが、まず1つめ。APIで提供されているデータはUTF-8なので、上記のようにmb_convert_encoding()を使っていますが、文字化けでダウンロードしたデータを読むことが出来ません。
このような場合の対処の仕方は、どのようにすれば良いのでしょうか?
また、2つ目の質問ですが、配列データをCSVでダウンロードするために、配列データを別ファイルに渡しているのですが、上記のようなやり方では、implodeで変数に代入すると文字列が長すぎて、正常にデータを渡すことが出来ません。
当初はCSVを生成するときもヤフーに接続して・・と行っていたのですが、これだと2度アクセスすることになり(1日のアクセス数の上限が定められている)、出来れば1度のアクセスで得たデータを利用したいと考えているのですが、このような場合、配列データを別ファイルに渡すにはどのようにするのが理想なのでしょうか?(セッションの利用も試したが上手くいきませんでした)
No.1ベストアンサー
- 回答日時:
> APIで提供されているデータはUTF-8なので、上記のようにmb_convert_encoding()を使っていますが、文字化けでダウンロードしたデータを読むことが出来ません。
文字化けというのは「使われている文字コード」と「読み込むプログラムが認識している文字コード」が一致しないときに発生します。
なので、「ダウンロードしたファイルの文字コードは何か」を確認して、その文字コードを指定すれば理屈上は文字化けになりません。
(提案) ブラウザかテキストエディタでcsvファイルを開いてみる
一番確実なのはダウンロードソフトでCSVファイルをダウンロードして、ブラウザないしテキストエディタで開いてみる事です。
このとき、文字コードをいろいろ指定して文字化けしない文字コードがあったら、それがCSVファイルで使われている文字コードになります。
そこから一つ一つ問題を切り分けしていけば、問題点が明確になって解決の目処も立つと思います。
ちなみに、OpenOfficeを使うと読み込むときに文字コードを指定できるようです。
(MS Excel2000 はShift_JIS決め打ち…かもしれません。)
> また、2つ目の質問ですが、配列データをCSVでダウンロードするために、配列データを別ファイルに渡しているのですが、
「配列データを別ファイルに渡している」の下りがよくわかりません…。
具体的にどうしているのか、を補足していただけるとよりクリティカルな回答がつくかなと思います。
この回答への補足
think49様
お世話になっております。
直接的な解決とは違うのですが、なんとか正常に文字化けせずにダウンロードさせることが出来ました。
質問1の対処:mb_convert_encodingを利用せずに出力することで文字化け解消。
質問2の対処:APIを利用しているため、ダウンロードさせる時は再使用せずに、と考えていましたが、再度APIにつないで解消。
ご親切な対応ありがとうございました。
think49様
こんばんは。ご親切なアドバイスをありがとうございます!
アドバイスいただいてから、色々と試しているのですが、いまだ解決できるに至っておりません。。
csv形式でダウンロードさせているのですが、アドバイスのようにブラウザで開こうとするものの、何故かエクセルで開かれてしまい、またエディタで開いてコードを調べようとしましたが、どれも解決の糸口さえ見えずにいる次第です。(ダウンロードせずに、ダウンロードすべくデータをブラウザで表示させると、UTF-8になっているのですが、ブラウザからエンコードの変更をしても反映されません)
また、
> また、2つ目の質問ですが、配列データをCSVでダウンロードするために、配列データを別ファイルに渡しているのですが、
これですが、APIから渡された配列データをCSVにてダウンロードさせる別ファイルに渡すため、配列データをimplodeで変数に収めてGETで渡し、渡されたデータをexplodeで配列に戻し・・・といったことをしています。
APIで渡された配列をCSVとしてダウンロードさせる別ファイルにわたすとき、
$array_data = urlencode(implode(",", $items));
echo "<a href=\"./csv.php?query=$array_data\">CSV</a>";
とし、ダウンロードファイルはさせるファイルは、
$query_data = $_GET["query"];
$items = explode(",", $query_data);
header("Content-Type: application/csv; charset=Shift_JIS");
header("Content-Disposition: attachment; filename=$fname.csv");//一意なファイル名となるようしている
$csv_line = implode("\n", $items);
print(mb_convert_encoding($csv_line, "SJIS", "UTF-8"));
と、こんな感じで行っているのですが、文字化けはもちろん、以上のようなやり方だと、配列データに日本語が入っていると、implodeにて変数に代入すると、文字数がとたんに長くなり、上手くデータを渡すことが出来ずにいる次第です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
$_SESSIONに二次元配列を使える...
-
配列をmb_ereg_replaceで一気に...
-
foreachのなかで次のキーを参照...
-
String だと「 ByRef引数の型が...
-
配列に配列を足すことはできるか?
-
PHPとMySQLの高速化
-
配列データをCSVでダウンロード...
-
$_POSTを一括してサニタイズし...
-
multiple属性のPOSTを配列で受...
-
file_existsでファイル名の部分...
-
配列一致(要素順番は違うが内容...
-
文字の先頭行を削除
-
前のページで入力したものをあ...
-
unset使用時の利点
-
PHPのカッコ[ ]の使い方について
-
PHP初心者です whileの回数を...
-
複数配列で重複する文字列を削...
-
ネストが深い時のforeachはどう...
-
C言語の配列をPush(追加)する...
-
pg_copy_fromの使い方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列をループでたくさん宣言し...
-
$_SESSIONに二次元配列を使える...
-
String だと「 ByRef引数の型が...
-
file_existsでファイル名の部分...
-
漢字のソートについて
-
PHPのカッコ[ ]の使い方について
-
ネストが深い時のforeachはどう...
-
foreachのなかで次のキーを参照...
-
チェックボックス複数選択 mys...
-
配列一致(要素順番は違うが内容...
-
PHPにてクラスを配列にすること...
-
postgresql関数をつかったレコ...
-
PHP 配列の添字に変数は使えない?
-
PHP掲示板で新着順に表示させた...
-
URLのサブドメインとドメイン部...
-
SESSION変数の2次元配列
-
PHPで配列をPOSTデータで送った...
-
$_POSTを一括してサニタイズし...
-
Smartyを使って、テーブルを表示
-
【Smarty】foreach関数やsectio...
おすすめ情報