保存場所の所有者の問題だった。
chown -R apache:apache 保存場所
とかやったら出来た。
保存場所の所有者の問題だった。
chown -R apache:apache 保存場所
とかやったら出来た。
前回の続き
1 |
$str = mb_convert_encoding($_POST["test"], "UTF-8", "ASCII"); |
ってやっても表示が変わっただけで文字は化けたままでした。
「テスト」という文字が
テスト
ってなってました。
もしやと思い、HTML QuickFormを使わずに無事表示出来た方のHTMLソースを見てみると画面上では「テスト」と表示されているものが、ソースでは「テスト」と表示されていました。
&#から始まるこの文字列は文字参照というものらしいです。
1 |
$str = mb_convert_encoding($_POST["test"], "UTF-8", "HTML-ENTITIES"); |
こうするとちゃんと表示されるらしい。
でもこれじゃ確認画面でのフォーム内の文字列は変わってなかった。
おそらく、HTML QuickForm自身が中で保持してる値を弄ってあげないとダメなのかもしれない…
$form->applyFilter('__ALL__', 'Class_Name::method_Name');
で、Class_Nameというクラス内に作ったmethod_Nameというメソッドに要素全部飛ばして
1 2 3 4 5 6 7 8 9 10 11 12 |
public static function method_Name($str){ foreach($_POST as $key => $val){ if('text' == Option::$form->getElementType($key) || 'textarea' == Option::$form->getElementType($key)){ $el = Option::$form->getElement($key); $el->setValue(mb_convert_encoding($val, "UTF-8", "HTML-ENTITIES")); } } return mb_convert_encoding($str, "UTF-8", "HTML-ENTITIES"); } |
returnのとこのmb_convert_encodingやらないと全角カタカナで入力してくださいってルールに引っかかる。
フォームにはちゃんとカタカナで入力されてるように表記されてるのに…。
これでやっと動くようにはなったけど
このやり方が正しいとはとても思えない…w
散々調べて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を使って作成しているのですが
それだと送信ボタンを押した後の確認画面でやっぱり文字化けしてました。