
いつもお世話になっています。
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
No.1ベストアンサー
- 回答日時:
それは円記号問題と呼ばれます。
Shift_JISでは2バイト文字の2バイト目が\と同じコードになりうるのでそれを誤認識しているのが原因です。
Shift_JISに固有の問題なので、EUC-JPやUnicode系の文字コードを使うのが一番確実な対処法です。
http://ja.wikipedia.org/wiki/Shift_JIS#2.E3.83.9 …
お返事有り難うございます。
円記号問題ですか・・・結構やっかいですね。
EUC-JPを使って対応してみます。
今日もプログラムだ~
No.3
- 回答日時:
詳しい内容は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つほどあるので、これから対応していきます。
どうもでした!
No.2
- 回答日時:
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でした!
これでやっとまともに動きます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイナリとBCDコード
-
COBOLのCOMP形式について
-
cprintf()関数で2バイト文字を...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
VB.NET LeftBの代用
-
Javaで日本語1文字のバイト数
-
COBOL PICTUREで X,S,Vの意味
-
VB6で漢字の1バイト目か2バイト...
-
ピクセル,dpiから容量(バイト...
-
任意のアルファベットの2進表...
-
text型の文字数
-
「1TB」のHDDに日本語は何字入...
-
データの取り出し?
-
char str[256]の256の意味は?
-
windowsのファイルパス最大文字数
-
iconv変換後のサイズについて
-
CRC計算方法
-
printfの%eで指数部分の桁数を...
-
PNGを24bppBMPに変換したいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
「1TB」のHDDに日本語は何字入...
-
ピクセル,dpiから容量(バイト...
-
バイト列とバイナリ列の違いが...
-
エクセルシート名の制限を変更...
-
文字コードの利点・欠点について
-
日付時刻を4バイトに
-
機種依存文字をチェックしたい。
-
ビットスワップとバイトスワッ...
-
バイナリとBCDコード
-
UCS-2の一覧表が欲しい
-
sedコマンドで全ての2バイト文...
-
VBAでShift-JISのURLエンコード
-
3バイト文字(UTF-8)をprintfで...
-
URLは最高何文字まで可能なので...
-
シフトJISの2バイト文字
-
この関数はどのプログラミング...
おすすめ情報