散々調べてformでファイルとかアップするときのmultipart/form-dataでは文字コードの変換が行われないってのは分かったのですが
直らないんですよ。文字化け。
まずは文字コードを取得してみました。
mb_detect_encoding($_POST['hoge']);
UTF-8らしいです。
これは正しい。
それで文字化けしていると言うことは、本当は別の文字コードで表示するべきものを、UTF-8で表示しちゃってるから化けてるんだよね?
というわけで、私も皆さんに習って
mb_convert_encoding("文字列", "変換後の文字コード", "変換前の文字コード");
やってみました。
変換前の文字コードってなんだろ。
多分Shift-JISかな?
1 2 |
$str = mb_convert_encoding($_POST["test"], "UTF-8", "SJIS"); print $str; |
その結果表示されたもの
ッテッスット
うん、惜しいw
私が表示したい正しい文字列は「テスト」
なんか余分なものがついてるwww
皆これで直ってるっぽいんだけどなぁ…
とりあえず現状確認
print_r(mb_get_info());
結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Array ( [internal_encoding] => UTF-8 [http_input] => ASCII [http_output] => SJIS [http_output_conv_mimetypes] => ^(text/|application/xhtml\+xml) [func_overload] => 0 [func_overload_list] => no overload [mail_charset] => ISO-2022-JP [mail_header_encoding] => BASE64 [mail_body_encoding] => 7bit [illegal_chars] => 0 [encoding_translation] => On [language] => Japanese [detect_order] => Array ( [0] => ASCII [1] => JIS [2] => UTF-8 [3] => EUC-JP [4] => SJIS ) [substitute_character] => 63 [strict_detection] => Off ) |
あれ?ASCII??
http_input が ASCII ってありなのかな?
調べてみたところ、php.iniの
detect_order = auto
ってなってると上の結果の配列の順番で文字コード選ばれるらしい。
確かに先頭配列にASCII入ってるわ。
こいつを
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
書き換えてApache再起動
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Array ( [internal_encoding] => UTF-8 [http_input] => ASCII [http_output] => SJIS [http_output_conv_mimetypes] => ^(text/|application/xhtml\+xml) [func_overload] => 0 [func_overload_list] => no overload [mail_charset] => ISO-2022-JP [mail_header_encoding] => BASE64 [mail_body_encoding] => 7bit [illegal_chars] => 0 [encoding_translation] => On [language] => Japanese [detect_order] => Array ( [0] => UTF-8 [1] => SJIS [2] => EUC-JP [3] => JIS [4] => ASCII ) [substitute_character] => 63 [strict_detection] => Off ) |
確かに配列の順番が変わった。
んだけどもhttp_input は ASCII のままだぞ?
いいのか?
試しにFORMタグに
accept-charset="ASCII"
を追加して
1 2 |
$str = mb_convert_encoding($_POST["test"], "UTF-8", "ASCII"); print $str; |
表示されました。
ちゃんとテストって表示されました。
でも、このフォーム、本来HTML QuickFormを使って作成しているのですが
それだと送信ボタンを押した後の確認画面でやっぱり文字化けしてました。