- 締切済み
PHPの文字化けについて(2)
いつもお世話になってます。 以前、以下の質問をさせて頂いた者です。 http://okwave.jp/qa/q7743818.html 以前とは異なった形で再度文字化けの問題が発生しており、 何か解決するための情報がありましたらご提供頂けませんでしょうか。 ------------------------- PHPで、テキストボックスと登録ボタンを配置した簡単な入力フォームを作成しました。 そこでテキストボックスに「章」と言う文字を入力し登録をすると、 DB側には「・ス・ス」と文字化けがなされて登録されます。 しかしながら上記の内容は、教授のPCでしか発生せず、 私のPCでは発生しない問題であるため原因の特定が難しく困っております。 PC自体は同じモノを使用しているため、 使っているブラウザの違いから本問題が発生しているのでは?と考えました。 教授はChrome(最新版)、私はIE又はFF(最新版)を使用しています。 ところが試に自PCへChrome(最新版)を入れ確認をしてみた所、 無事「章」という文字が登録されたため、未だに私の環境では発生しません。 次にPHPのソースに問題があるのではないかと考えました。 入力された文字列は1つの事を除き、そのままDBへ登録しています。 やっていることは、「前後にスペースが入っていれば取り除く」と言う事です。 以下、ソースになります。 ---- function alltrim($str){ $str = preg_replace('/^[[:space:]]+/', "", $str); $str = preg_replace('/[[:space:]]+$/', "", $str); return $str; } ---- 何かおかしな点等ありますでしょうか? 他に調べたほうがよい事柄がありましたら 情報のご提供宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
agunuzさん >> utf-8のソースなら、trimの第二引数に" \t\n\r\0\x0B"のように(って空白は見えませんよねww)asciiの空白とマルチバイトの空白の両方を書いてしまえばいいと思います。 それだと問題があります。 例: trim('あ', ' '); 「あ」 E3 81 82 「 」 E3 80 80 trim関数はバイト単位の扱いとなるので、先頭のE3が破壊されてしまいます。全角スペースを含む場合は正規表現が必要となりますが、 function alltrim($str) { $str = preg_replace('/^[[:space:] ]+/u', "", $str); $str = preg_replace('/[[:space:] ]+$/u', "", $str); return $str; } これだと2回実行しているうえにバックトラックが無駄に発生してしまうので、独占的最長マッチを活用して最適化します。ついでに他のASCII制御文字もトリミングの対象に含むことにします。 function alltrim($str) { $chars = "[\\x0-\x20\x7f\xe3\x80\x80]"; return preg_replace("/\A{$chars}++|{$chars}++\z/u", "", $str); } なお、u修飾子を用いているのでUTF-8マルチバイトエンコーディングを考慮した正しいトリミングが行えますが、UTF-8として不正なバイトコードが渡されたときにはNULLが返されることに注意してください。 【関連】 汎用的な変数構造フィルタリング関数 | Qiita http://qiita.com/mpyw/items/c39b9ee695a5c2e74627
- agunuz
- ベストアンサー率65% (288/438)
>trimをかけるだけで問題無かったのでしょうか。 utf-8のソースなら、trimの第二引数に" \t\n\r\0\x0B"のように(って空白は見えませんよねww)asciiの空白とマルチバイトの空白の両方を書いてしまえばいいと思います。 #正規表現の関数を使うよりもはるかに(10倍以上)高速です。
補足
回答頂きありがとう御座います。 >#正規表現の関数を使うよりもはるかに(10倍以上)高速です。 なるほど、高速化の要素もあるんですか。 大変勉強になりました。
>> PHPで、テキストボックスと登録ボタンを配置した簡単な入力フォームを作成しました。 <?php header('Content-Type: text/html; charset=utf-8'); ?> による文字セット指定を行っていますか?metaタグを使う方法では、ブラウザがその通りに表示するかどうかの保証はされません。あくまで補助的な情報として扱われるだけです。 また、 >> function alltrim($str){ >> $str = preg_replace('/^[[:space:]]+/', "", $str); >> $str = preg_replace('/[[:space:]]+$/', "", $str); >> return $str; >> } この関数ですが、UTF-8でなければ文字化けのリスクがあるし、UTF-8であればこんなものを作らなくてもtrim関数を使うだけで十分です。 エディタの設定など http://qiita.com/mpyw/items/4508dc677b11e487effc#1-5 UTF-8が推奨される理由 http://qiita.com/mpyw/items/d61b50d90e84e289e2be#1-5 データベース接続時のまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71
補足
回答頂きありがとうございます。 ><?php header('Content-Type: text/html; charset=utf-8'); ?> >による文字セット指定を行っていますか? metaタグによる指定しか行っていませんでした。 早速試してみようと思います。 Trim関数の件なのですが、 以下のブログ記事を参考にさせて頂いてました。 http://rockstock2008.blog17.fc2.com/blog-entry-54.html 半角・全角・タブに問わず空白であれば 文字列前後の空白を全て除去すると言う意味で、 有効な関数かな、と思っていたのですが、 trimをかけるだけで問題無かったのでしょうか。 もし再度本質問を見る事が御座いましたら、 お教え頂けると幸いです。
補足
確認が遅くなってしまいすみません。 関連ページも確認させて頂きました。 自分が行いたい事は、FILTER_STRUCT_FULL_TRIM オプションの内容になるのですね。 それを関数例として記載頂き有難う御座います。 未だ発生する環境を自分の方で 作る事が出来ていないのが難点ですが、 早速試してみたいと思います。