HTML QuickFormで作成したFormでenctypeにmultipart/form-dataを指定する。

前回の続き

ってやっても表示が変わっただけで文字は化けたままでした。
「テスト」という文字が

テスト

ってなってました。
もしやと思い、HTML QuickFormを使わずに無事表示出来た方のHTMLソースを見てみると画面上では「テスト」と表示されているものが、ソースでは「テスト」と表示されていました。

&#から始まるこの文字列は文字参照というものらしいです。

こうするとちゃんと表示されるらしい。

でもこれじゃ確認画面でのフォーム内の文字列は変わってなかった。

おそらく、HTML QuickForm自身が中で保持してる値を弄ってあげないとダメなのかもしれない…

$form->applyFilter('__ALL__', 'Class_Name::method_Name');

で、Class_Nameというクラス内に作ったmethod_Nameというメソッドに要素全部飛ばして

returnのとこのmb_convert_encodingやらないと全角カタカナで入力してくださいってルールに引っかかる。
フォームにはちゃんとカタカナで入力されてるように表記されてるのに…。

これでやっと動くようにはなったけど
このやり方が正しいとはとても思えない…w

 

multipart/form-dataで文字化け

散々調べてformでファイルとかアップするときのmultipart/form-dataでは文字コードの変換が行われないってのは分かったのですが
直らないんですよ。文字化け。

まずは文字コードを取得してみました。

mb_detect_encoding($_POST['hoge']);

UTF-8らしいです。
これは正しい。
それで文字化けしていると言うことは、本当は別の文字コードで表示するべきものを、UTF-8で表示しちゃってるから化けてるんだよね?

というわけで、私も皆さんに習って

mb_convert_encoding("文字列", "変換後の文字コード", "変換前の文字コード");

やってみました。
変換前の文字コードってなんだろ。
多分Shift-JISかな?

その結果表示されたもの

ッテッスット

うん、惜しいw
私が表示したい正しい文字列は「テスト」
なんか余分なものがついてるwww

皆これで直ってるっぽいんだけどなぁ…
とりあえず現状確認

print_r(mb_get_info());

結果

あれ?ASCII??
http_input が ASCII ってありなのかな?

調べてみたところ、php.iniの

detect_order = auto

ってなってると上の結果の配列の順番で文字コード選ばれるらしい。
確かに先頭配列にASCII入ってるわ。

こいつを

mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII

書き換えてApache再起動

確かに配列の順番が変わった。
んだけどもhttp_input は ASCII のままだぞ?
いいのか?

試しにFORMタグに

accept-charset="ASCII"

を追加して

表示されました。
ちゃんとテストって表示されました。

でも、このフォーム、本来HTML QuickFormを使って作成しているのですが
それだと送信ボタンを押した後の確認画面でやっぱり文字化けしてました。

HTML QuickFormを使用している場合の対処