牛、豚、鶏、どれか一つ食べられなくなるとしたら?

こんばんは。お世話になっております。
題名にある「配列データを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度のアクセスで得たデータを利用したいと考えているのですが、このような場合、配列データを別ファイルに渡すにはどのようにするのが理想なのでしょうか?(セッションの利用も試したが上手くいきませんでした)

A 回答 (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につないで解消。

ご親切な対応ありがとうございました。

補足日時:2009/05/21 01:51
    • good
    • 0
この回答へのお礼

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にて変数に代入すると、文字数がとたんに長くなり、上手くデータを渡すことが出来ずにいる次第です。

お礼日時:2009/05/20 23:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!