• 締切済み

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; } ---- 何かおかしな点等ありますでしょうか? 他に調べたほうがよい事柄がありましたら 情報のご提供宜しくお願い致します。

みんなの回答

noname#244856
noname#244856
回答No.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

megumi1122
質問者

補足

確認が遅くなってしまいすみません。 関連ページも確認させて頂きました。 自分が行いたい事は、FILTER_STRUCT_FULL_TRIM オプションの内容になるのですね。 それを関数例として記載頂き有難う御座います。 未だ発生する環境を自分の方で 作る事が出来ていないのが難点ですが、 早速試してみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>trimをかけるだけで問題無かったのでしょうか。 utf-8のソースなら、trimの第二引数に"  \t\n\r\0\x0B"のように(って空白は見えませんよねww)asciiの空白とマルチバイトの空白の両方を書いてしまえばいいと思います。 #正規表現の関数を使うよりもはるかに(10倍以上)高速です。

megumi1122
質問者

補足

回答頂きありがとう御座います。 >#正規表現の関数を使うよりもはるかに(10倍以上)高速です。 なるほど、高速化の要素もあるんですか。 大変勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
noname#244856
noname#244856
回答No.1

>> 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

megumi1122
質問者

補足

回答頂きありがとうございます。 ><?php header('Content-Type: text/html; charset=utf-8'); ?> >による文字セット指定を行っていますか? metaタグによる指定しか行っていませんでした。 早速試してみようと思います。 Trim関数の件なのですが、 以下のブログ記事を参考にさせて頂いてました。 http://rockstock2008.blog17.fc2.com/blog-entry-54.html 半角・全角・タブに問わず空白であれば 文字列前後の空白を全て除去すると言う意味で、 有効な関数かな、と思っていたのですが、 trimをかけるだけで問題無かったのでしょうか。 もし再度本質問を見る事が御座いましたら、 お教え頂けると幸いです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • php 指定文字列以降の削除

    phpにて半角スペース以降の文字列を問答無用で削除するというプログラムを作ろうとしてるのですが上手くいきません。 どうすればできますでしょうか? ご教授のほどよろしくお願いいたします。 ---- ソースコード $str = '2017/1/1 10-28'; if (preg_match("/ /", $str)){ $replace = str_replace(' ', '', $str); } echo $replace;

    • ベストアンサー
    • PHP
  • PHPの正規表現で【】内を文字列ごと削除

    あいうえお【かきく】けこさ。【しすせそ】 といった感じの文字列を、【かきく】や【しすせそ】を削除して、 ”あいうえお けこさ。” としたいのですが・・・ $str = preg_replace("【.*】"," ",$str) とすると、 あいうえお ってなっちゃうし、 $str = preg_replace("/【.{1,5}?】/"," ",$str) とかやってみても上手く行かず。 はて?「/」は何を意味するのだろう。とか思いながら試行錯誤してはみてるのですが・・・ どなたかご教授くださいませんでしょうか。 お願いします。

    • ベストアンサー
    • PHP
  • 【PHP】常にマルチバイト文字列関数でいいですか?

    PHP初心者です。バージョンは4です。 文字を扱う関数はマルチバイト対応と非対応があるみたいですがその使い分けがわかりません。いっそ常にマルチバイト対応にしとけばいいのではと考えてしまいますがどうなのでしょう?たとえば、置換の場合、 preg_replace と str_replace がありますが、常に preg_replace を使っていて問題はないのでしょうか? お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • preg_replace 英数字以外の文字の前後のスペースを削除

    preg_replaceで 英数字の前後いずれかのスペースは残して それ以外のスペースを消したいのですが あ a間が消えてしまいます。(英数字前なので消さない) a aはのこるので英数字後のスペースは残せてます。 <?php $str = \"あ a a\"; $txt = preg_replace(\"/([^a-zA-Z\\d])\\s+/u\", \"$1\", $str); echo $txt;

    • ベストアンサー
    • PHP
  • ある文字からある文字までの削除について

    現在ケータイサイト用に書いた文章をPCでも見れるようにしているのですが、 ケータイサイト用の絵文字コードが直接表示されてしまうため、preg_replaceで削除したいのですがパターンはどのように記述すればよろしいでしょうか? $str = "おはようございます[i:100]。こんにちは[i:101]。こんばんわ[i:102]。"; ↓ [ から ] までの文字を消し、 $str = "おはようございます。こんにちは。こんばんわ。"; と表示させたいのです…。 ご教授頂けたら幸いですm(_ _;)m よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの文字化けについて

    いつもお世話になってます。 以下の様な問題が発生しておりまして、 何か解決するための情報がありましたらご提供頂けませんでしょうか。 ------------ PHPで、テキストボックスと登録ボタンを配置した簡単な入力フォームを作成しました。 (登録ボタン押下後は入力した文字を消すことはせず、 DB側に登録した内容をテキストボックスに表示するような形式です。) ところがテキストボックスに「能」と言う文字を入力すると、 文字化けを起こし、「??」と言う文字が表示されます。 「一」や「日」などは問題ありませんでした。 これは2byte文字の変換に失敗している所為と考え、文字コードについて調べました。 PHP側からは全てutf8の文字コードでデータを送信しています。 DB側の文字コードは以下のようになっていました。 >show variables like 'character\_set\_%'; Variable_name Value character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary character_set_results utf8 character_set_server ujis character_set_system utf8 各種サイト様を参考にしたところ、 character_set_server が ujis となっているのが問題のような気がしています。 ですが、本DBは学校で借りているレンタルサーバを使用しているため、 my.cnf等直接ファイルを修正することが出来ません。 なので、以下のサイト様を参考にSQL発行の際には必ず SET character_set_server = utf8; も発行するようにしてみたのですが、上手くいきませんでした。 http://thesnowcolor.blogspot.jp/2010/10/phpmyadmin.html 自ら試したのはここまでです、何かほかに調べたほうがよい、 などありましたら情報のご提供宜しくお願い致します。 【PHP環境】 Apache 2.2.3 PHP 5.1.6 MySQL 5.0.45 (※他、必要情報ありましたらご指摘お願いします)

    • ベストアンサー
    • PHP
  • PHPで文字を検索して取り込みたい。

    PHPで文字を検索して取り込みたい。 %の文字が、何度か出現するソースなのですが そのソースの中にある50%のような全角で%の数値を 取り込みたいのです。 //////ソース//////// <table> <TR> <TD>あ</TD> <TD><B>88%</B>/TD> </TR> <TR> <TD>す</TD> <TD><B>85%</B>/TD> </TR> ........... </table> /////////////////////// 下記のように実行しましたが 思うような結果は得られません。 <?php $str = file_get_contents('http://123456/index.html'); if (preg_match('!<table>\s*?(.*?)</table>!s', $str, $res)) $text = mb_convert_encoding($res[1],"shift-jis","UTF-8");preg_match_all("/-*[0-9]+/",str_replace(",","",$text),$matches); print ($matches[0][0]); ////////////////////////////// php初心者です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字化け

    PHPを最近勉強し始めたのですが、どうしても文字化けしてしまう箇所があり質問させていただきました。 海外から購入したスクリプトを日本語化しようとしているのですが、エンコード方式が違う?ため、文字化けするようです。(.phpファイルの文字コードはEUC-JPで統一しています) function encode_s($s) { $s = rawurlencode($s); $s = str_replace('%26','&',$s); $s = preg_replace('/%([\dABCDEF]{2})/e', "'&#'.hexdec('\\1').';'",$s); return $s; } マルチバイト関数等を勉強中ですが現状ではわからないです。 どなたかご指摘お願いします。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 指定の文字を入れ替えることについて!

    こんばんわっ! 最近は寒くなってきました。 インフルエンザは大丈夫ですか皆さん。 さて早速質問行かせて頂きます。 フォームの入力値に絵文字が入っていたら取り除くと言う事をしてたんですけど。。。 バイナリ値に分解は出来ました。 分解を行い絵文字を〓にしたいと思っています。 $_POST[1] = str_replace('/\[d:(F[346789][0-F]{2})\]/e', '〓', $_POST[1]); にしてみましてけどだめでした。 $_POST[1] = str_replace('/BAD\+(F[346789][0-F]{2})/', '[★]', $_POST[1]); を加えてみてもだめでした。 preg_replace にしてみてもだめでした。 どこが間違っていますか!!!

    • ベストアンサー
    • PHP
  • preg_replaceで改行が含まれてしまう

    preg_replaceを使って置換をしようと思い、 $str = <<< END test test ;comment test END; $fstr = preg_replace("/;(.*$)/m", "<>;\\1<>", $str); echo $fstr; と言うようにやってみたのですが、置換した文字の後に改行が入ってしまいます どのようにすればいいのでしょうか?

    • ベストアンサー
    • PHP