ある文字列 [ $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です。
これが問題なのでしょうか?
(このソースの文字コードは変更できません)
ぱっと見て気になるのは、headerでの出力前にprintで出力しちゃって大丈夫?というのが気になります。
この辺りは、デバッグ中と解釈すると、その他に明らかな問題はないような気がするのですが、
$prtStringが文字列なのであれば、mb_convert_encodingを使ってはどうですか?
あとは、せっかくmb_detect_encodingで確認しているのであれば、autoではなく、EUC-JPを指定してみては如何でしょうか?
これ以外となると、PHPもしくはWebサーバ関連で出力時に文字コードの自動変換が機能しているというのが怪しい気がします。
何かの参考になれば。
ぱっと見て気になるのは、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を使ったりしたのでした)。
なるほど、文字コードの自動変換かぁ~~(^^;;
それか?
サーバの設定は分からないから、そうだとすると諦めるしか(^^;
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");
う~ん、なるほど、明らかな問題はない、ですか……。
まぁ、もちろん、自分では問題がないつもりで作っているので困っちゃってるんですが(^^;
headerとprintの順序は関係ないみたいですね。
入れ替えても影響ないです。
EUC-JPをautoで書いているのは質問にあたり問題を複雑化しないためで、そこはEUC-JPにしてみても変わりませんでした(元はといえば、autoがいけないのかなと疑ったために、mb_detect_encodingを使ったりしたのでした)。
なるほど、文字コードの自動変換かぁ~~(^^;;
それか?
サーバの設定は分からないから、そうだとすると諦めるしか(^^;