アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっています。
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

A 回答 (3件)

それは円記号問題と呼ばれます。


Shift_JISでは2バイト文字の2バイト目が\と同じコードになりうるのでそれを誤認識しているのが原因です。
Shift_JISに固有の問題なので、EUC-JPやUnicode系の文字コードを使うのが一番確実な対処法です。
http://ja.wikipedia.org/wiki/Shift_JIS#2.E3.83.9 …
    • good
    • 0
この回答へのお礼

お返事有り難うございます。
円記号問題ですか・・・結構やっかいですね。

EUC-JPを使って対応してみます。

今日もプログラムだ~

お礼日時:2008/10/18 09:56

詳しい内容は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);
?>

お試しください
    • good
    • 0
この回答へのお礼

ぉおお、こんな便利な関数があるんですね。
これは非常に参考になります。

実を言うと、\が表示されるバグがあるサイトが他にも3つほどあるので、これから対応していきます。
どうもでした!

お礼日時:2008/11/09 10:10

PHPのことはあまりくわしくないですが参考までに、


#1さんが仰ってるように、Sift_JISの「構」「貼」の2バイト目は 0x5C で、これは「\」と同じです。
ですから、場合によって、前の文字の2バイト目の 0x5C が次の文字をエスケープする「\」と誤認して文字化けやエラーを起こします。
これを防ぐために、これらの文字を含む文字列をプリントしたり、変数に代入するときは、これらの文字は後に「\」を付けますがこの「\」は見えないものです。
ところで、ご質問の例文はこの「\」が見えています。
ということは、エスケープのための「\」が二重になっているわけです。この「\」を除去するために、
$_POST['text']=str_replace("\\","",$_POST['text']);
とすると、「構」 「貼」の2バイト目の 0x5C も除去され文字化けしてしまいます。ということでここは、
$_POST['text']=str_replace("\\\\","\\",$_POST['text']);
とすべきではないでしょうか。
    • good
    • 0
この回答へのお礼

亀レスすいません。
本日やっと暇が開いたのでwebプログラムの編集作業を致しました。
表記の通りにstr_replaceでデータを置き換えたらばっちりOKでした!

これでやっとまともに動きます。
ありがとうございました。

お礼日時:2008/11/09 10:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!