人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPについて質問です。

ある文字列 [ $prtString ] があります(マルチバイトを含む)。
この文字列は、
mb_detect_encoding($prtString);
すると
EUC-JP
が返って来ます。

この文字列をcsv形式で書き出そうと思っているのですが、

mb_convert_variables("EUC-JP","auto",$prtString);
print($prtString);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=download.csv");

とすると、問題なく文字コードEUCで書き出されるのに、

mb_convert_variables("SJIS","auto",$prtString);
print($prtString);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=download.csv");

とすると、Shift-JISでファイルを開いても日本語が化け化けになってしまいます。

EUC-JPの文字列をSJISで書き出す方法が
何か間違っているのでしょうか?
教えて下さい。

ちなみに、上記ソースを書いたPHPソースそのものの文字コードはEUCです。
これが問題なのでしょうか?
(このソースの文字コードは変更できません)


●質問者: nacbox
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:application CSV Download EUC EUC-JP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● t_shiono
●35ポイント ベストアンサー

ぱっと見て気になるのは、headerでの出力前にprintで出力しちゃって大丈夫?というのが気になります。

この辺りは、デバッグ中と解釈すると、その他に明らかな問題はないような気がするのですが、

$prtStringが文字列なのであれば、mb_convert_encodingを使ってはどうですか?

あとは、せっかくmb_detect_encodingで確認しているのであれば、autoではなく、EUC-JPを指定してみては如何でしょうか?

これ以外となると、PHPもしくはWebサーバ関連で出力時に文字コードの自動変換が機能しているというのが怪しい気がします。


何かの参考になれば。

◎質問者からの返答

う?ん、なるほど、明らかな問題はない、ですか……。

まぁ、もちろん、自分では問題がないつもりで作っているので困っちゃってるんですが(^^;

headerとprintの順序は関係ないみたいですね。

入れ替えても影響ないです。

EUC-JPをautoで書いているのは質問にあたり問題を複雑化しないためで、そこはEUC-JPにしてみても変わりませんでした(元はといえば、autoがいけないのかなと疑ったために、mb_detect_encodingを使ったりしたのでした)。

なるほど、文字コードの自動変換かぁ??(^^;;

それか?

サーバの設定は分からないから、そうだとすると諦めるしか(^^;


2 ● ymlab
●35ポイント

http://zapanet.info/phpdoc/function.mb-detect-encoding.html

では、mb_detect_encodingで、strictモードが選択できるようになっていますが、

試されてみたでしょうか。

また、参考になるかはわかりませんが、

・私もそんな状況で困ったのですが、auto指定ではうまくいかず、autoのところを、

EUC-JPとわかっていた場合、EUC-JPときちんと指定した場合はうまくいったパターンがありました。

・mb_convert_variablesと内部的な同じ動作かもしれませんが、mb_convert_encodingも試してみてください。

・headerのContent-Typeに、charsetを指定してみたらよいかもしれません。

◎質問者からの返答

確認してみました。

・mb_detect_encoding で strict を TRUE指定しても結果は特に変わらず(=EUC-JP)

・auto を EUC-JP にする→念のため再度確認してみましたが結果に影響なし

・mb_convert_encodingにしてみる→結果に影響なし

・Content-Typeにcharsetを指定→結果に影響なし

総合して以下のように書きました。

結果は変わりません。

なんでなんだろう……。

$prtString=mb_convert_encoding($prtString,"SJIS","EUC-JP");

print($prtString);

header("Content-Type: application/octet-stream; charset=Shift_JIS");

header("Content-Disposition: attachment; filename=download.csv");

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ