いつもお世話になっています。
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で質問しましょう!
似たような質問が見つかりました
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP 文字列を段落で分ける方法を教えて下さい。 2 2023/03/09 10:03
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
エクセルシート名の制限を変更...
-
char str[256]の256の意味は?
-
VBでShift_JISへurlエンコード...
-
COBOL PICTUREで X,S,Vの意味
-
ピクセル,dpiから容量(バイト...
-
バイナリとBCDコード
-
VBAでShift-JISのURLエンコード
-
この関数はどのプログラミング...
-
VB6で漢字の1バイト目か2バイト...
-
C/C++の型について
-
ビットスワップとバイトスワッ...
-
バイト配列 抜き出す
-
GetWindowTextでアドレスバーか...
-
全角半角を調べるライブラリ関...
-
最大長を用意せずにバイナリデ...
-
VB.NET LeftBの代用
-
(C#)1バイトの正規表現
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイナリとBCDコード
-
「1TB」のHDDに日本語は何字入...
-
Javaで日本語1文字のバイト数
-
バイト列とバイナリ列の違いが...
-
SQLで1バイト、2バイト混在...
-
ピクセル,dpiから容量(バイト...
-
C++ Builderで文字列をバイトに...
-
64bit対応
-
ワイド文字のバイト数が取得で...
-
UCS-2の一覧表が欲しい
-
3バイト文字(UTF-8)をprintfで...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
ビットスワップとバイトスワッ...
-
VBSでテキストファイルの文字列...
おすすめ情報