- ベストアンサー
formからPOSTしたテキストエリア内の文字列が文字化けする(PHP)
いつもお世話になっています。 PHPでホームページを作成しているのですが、以下のような文字化け(?)が発生して困っています。 ●formからtextarea内のデータをPOST送信 <textarea name="kiji"> 私は事務所を構えていた。 窓には広告が貼ってあったが、その数が大変多かった。 中には広告とは関係ないものも貼ってあったが、その一つを見てみると日本の美しい景色が広がっていた。 </textarea> ↓ ●PHPでkiji.datに$_POST['kiji']と日時を記述 <?php $newfile = fopen("kiji.dat","a+") or die("ファイル オープン エラー"); flock($newfile,LOCK_EX); fputs($newfile,strip_tags($_POST['kiji'])."\n<font size=1>作成日:".date('Y/m/d h:i:s')."</font>"); fclose($newfile); ?> ↓ ●kiji.dat内の文字を見ると・・・ kiji.dat内のテキストが以下のように「\」が各所に入ってしまっている。 私は事務所を構\えていた。 窓には広告が貼\ってあったが、その数が大変多かった。 中には広告とは関係ないものも貼\ってあったが、その一つを見てみると日本の美しい景色が広がっていた。 なぜ「\」が入ってしまうのか非常に困っています。 $_POST['text']=str_replace("\\","",$_POST['text']); で\\を除去しようとすると、「高ヲ」といった完全な文字化けになります。 mb_str_replaceを試そうとしましたが、ロリポップサーバーは対応 していないようでした。 お詳しい方がおられましたら、ご教授の程をお願い致しますm(__)m
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
それは円記号問題と呼ばれます。 Shift_JISでは2バイト文字の2バイト目が\と同じコードになりうるのでそれを誤認識しているのが原因です。 Shift_JISに固有の問題なので、EUC-JPやUnicode系の文字コードを使うのが一番確実な対処法です。 http://ja.wikipedia.org/wiki/Shift_JIS#2.E3.83.90.E3.82.A4.E3.83.88.E7.9B.AE.E3.81.8C5C.E7.AD.89.E3.81.AB.E6.88.90.E3.82.8A.E3.81.86.E3.82.8B.E3.81.93.E3.81.A8.E3.81.AB.E3.82.88.E3.82.8B.E5.95.8F.E9.A1.8C
その他の回答 (2)
- neko-ten
- ベストアンサー率55% (1287/2335)
詳しい内容はANo1/ANo2の方が記載されているので・・ PHP4/5であれば、stripslashes関数を使ってしまう手もあります。 <?php $PostStr = stripslashes($_POST['kiji']); $newfile = fopen("kiji.dat","a+") or die("ファイル オープン エラー"); flock($newfile,LOCK_EX); fputs($newfile,strip_tags($PostStr)."\n<font size=1>作成日:".date('Y/m/d h:i:s')."</font>"); fclose($newfile); ?> お試しください
お礼
ぉおお、こんな便利な関数があるんですね。 これは非常に参考になります。 実を言うと、\が表示されるバグがあるサイトが他にも3つほどあるので、これから対応していきます。 どうもでした!
- okmotokun
- ベストアンサー率59% (92/155)
PHPのことはあまりくわしくないですが参考までに、 #1さんが仰ってるように、Sift_JISの「構」「貼」の2バイト目は 0x5C で、これは「\」と同じです。 ですから、場合によって、前の文字の2バイト目の 0x5C が次の文字をエスケープする「\」と誤認して文字化けやエラーを起こします。 これを防ぐために、これらの文字を含む文字列をプリントしたり、変数に代入するときは、これらの文字は後に「\」を付けますがこの「\」は見えないものです。 ところで、ご質問の例文はこの「\」が見えています。 ということは、エスケープのための「\」が二重になっているわけです。この「\」を除去するために、 $_POST['text']=str_replace("\\","",$_POST['text']); とすると、「構」 「貼」の2バイト目の 0x5C も除去され文字化けしてしまいます。ということでここは、 $_POST['text']=str_replace("\\\\","\\",$_POST['text']); とすべきではないでしょうか。
お礼
亀レスすいません。 本日やっと暇が開いたのでwebプログラムの編集作業を致しました。 表記の通りにstr_replaceでデータを置き換えたらばっちりOKでした! これでやっとまともに動きます。 ありがとうございました。
お礼
お返事有り難うございます。 円記号問題ですか・・・結構やっかいですね。 EUC-JPを使って対応してみます。 今日もプログラムだ~