- PR -

phpの文字化け(¥マーク)

投稿者投稿内容
tuchida
大ベテラン
会議室デビュー日: 2006/08/06
投稿数: 125
投稿日時: 2008-01-20 12:18
いつもお世話になっております。

tuchidaです。

現在以下の環境でphpを書いているのですが
入力した値をファイルに出力しているのですが、
所々に「¥」マークが入ってしまいます。
(特にURLの前後)
この「¥」がでないようにしたいのですがよくわかりません。
どなたかご存知の方がいらっしゃればご教示いただきたいと思います。

よろしくお願いします。

OS SuSE Linux10.0
Apache2.0
PHP 4.4.0

<php.iniの内容>
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = Shift-JIS
mbstring.http_input = auto
mbstring.http_output = Shift-JIS
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = "";
mbstring.func_overload = 2
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-01-20 13:05
magic_quotes_gpcの値を確認してください(おそらくTRUEだと思いますが)。

  http://jp.php.net/manual/ja/ref.info.php#ini.magic-quotes-gpc

サンプルにもあるように、フォームから受け取ったままの状態でSQL文に書けるようにescapeされますが、普通は「そのままDBに入れる」ことはないので、無駄といえば無駄ですが・・。

今は(逆に)get_magic_quotes_gpc()がTRUEだったら、stripslashes()を通す・・というのが基本だと思います。確認画面を挟むことが多いですし。DBに入れるときは自前でescapeしますね。addslashes()とか(MySQLだったら)mysql_real_escape_stringとか。

(蛇足)
mbstring.internal_encodingでShift-JISって使いにくくないですか?リテラルを書くのにも気を遣わないといけないですよね。

[ メッセージ編集済み 編集者: shimix 編集日時 2008-01-20 13:05 ]
tuchida
大ベテラン
会議室デビュー日: 2006/08/06
投稿数: 125
投稿日時: 2008-01-20 14:14
引用:

shimixさんの書き込み (2008-01-20 13:05) より:
magic_quotes_gpcの値を確認してください(おそらくTRUEだと思いますが)。

  http://jp.php.net/manual/ja/ref.info.php#ini.magic-quotes-gpc

サンプルにもあるように、フォームから受け取ったままの状態でSQL文に書けるようにescapeされますが、普通は「そのままDBに入れる」ことはないので、無駄といえば無駄ですが・・。


調べてみましたが、ちょっと...
(あくまで、SuSELinux10.0のでインストールしたままです)

magic_quotes_gpc = On

となっています。?

引用:

今は(逆に)get_magic_quotes_gpc()がTRUEだったら、stripslashes()を通す・・というのが基本だと思います。確認画面を挟むことが多いですし。DBに入れるときは自前でescapeしますね。addslashes()とか(MySQLだったら)mysql_real_escape_stringとか。


記載もれですみません。
POSTするときは以下の行です。

$nextForm = stripslashes($_POST["NextForm"]);

上記の状態でも¥マークが入ってしまいました。

引用:

(蛇足)
mbstring.internal_encodingでShift-JISって使いにくくないですか?リテラルを書くのにも気を遣わないといけないですよね。

[ メッセージ編集済み 編集者: shimix 編集日時 2008-01-20 13:05 ]


PHP初心者なため、viでじか書きしていますが、UpLoadしたものを見るときにちょっとつらいです。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-01-20 19:01
引用:

tuchidaさんの書き込み (2008-01-20 14:14) より:
となっています。?


なっているということですね?(何故疑問符が・・)

引用:

記載もれですみません。
POSTするときは以下の行です。

$nextForm = stripslashes($_POST["NextForm"]);

上記の状態でも¥マークが入ってしまいました。



「POSTするとき」っていつのことでしょう?「ファイルに書き出し」ているんですよね?ファイルに書き出したあとのタイミングで$_POST["NextForm"]と$nextFormをprintしてみてください。

で、ファイルに書き出しているのが間違いなく$nextFormかどうかも再確認してください。

ちなみにphpの変数名は大文字・小文字を区別しますので "NextForm" / $nextForm なんて命名はちょっと怖いです・・。

引用:

PHP初心者なため、viでじか書きしていますが、UpLoadしたものを見るときにちょっとつらいです。


いや、そういう問題でもないんですが(汗)。わざわざ非推奨の文字コードを使うのは何故かなと。

[ メッセージ編集済み 編集者: shimix 編集日時 2008-01-20 19:05 ]
tuchida
大ベテラン
会議室デビュー日: 2006/08/06
投稿数: 125
投稿日時: 2008-01-20 21:29
お世話になっております。

tuchiadです。

引用:

「POSTするとき」っていつのことでしょう?「ファイルに書き出し」ているんですよね?ファイルに書き出したあとのタイミングで$_POST["NextForm"]と$nextFormをprintしてみてください。


このプログラムを呼ぶ前の画面で複数行のテキスト入力項目がありこの名前が「NextForm」です。
この入力結果をPOSTするときのコードを書いたつもりでした。
(説明が足りなくてすみません)

引用:

で、ファイルに書き出しているのが間違いなく$nextFormかどうかも再確認してください。
ちなみにphpの変数名は大文字・小文字を区別しますので "NextForm" / $nextForm なんて命名はちょっと怖いです・・。




勉強不足で叱られそうですが、Telnet(TeraTerm)で接続して中身を確認すると
漢字の部分が化け化けでわかりません。
ダウンロードしてから確認すると¥マーク以外は問題ない状態です。
本来ならばここで判らなければ成らないのかとも思うのですが
このときのコードが理解不足のためわかりません。

引用:

いや、そういう問題でもないんですが(汗)。わざわざ非推奨の文字コードを使うのは何故かなと。


もともと設定してなかったのですがテストをしているうちに結果的に現在の指定になりました。
本来はShift−JIS以外の方がいいのでしょうが先に書いてしまったので
直せないでいます。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-01-20 23:00
いや、ですからファイルに書き出したあとのタイミングで$_POST["NextForm"]と$nextFormをprintしてみられたんでしょうか?その時点で$_POST["NextForm"]と$nextFormには「¥」が入っていましたか?

引用:

$nextForm = stripslashes($_POST["NextForm"]);

上記の状態でも¥マークが入ってしまいました。


ということでしたが、この状態で$nextFormに「¥」があるとしたら、$_POST["NextForm"]は「¥¥」の状態ではないか・・ということを確認していただきたいのですが。


どういう作りになっているのかわかりませんが、よくあるのは実際のファイル書き出しの前の「確認画面」にhiddenで渡すときに$_POSTを(stripslashesせずに)そのまま渡してしまうというのがあります。foreachで$_POSTをLoop処理するだけになっていませんか?

・・っていうかそれは確認画面のhtmlソースを(ブラウザ側で)見ればわかることですよねぇ(汗

[ メッセージ編集済み 編集者: shimix 編集日時 2008-01-20 23:03 ]
tuchida
大ベテラン
会議室デビュー日: 2006/08/06
投稿数: 125
投稿日時: 2008-01-20 23:57
お世話になっております。


肝心の所が抜けていて、大変すみません。

引用:

shimixさんの書き込み (2008-01-20 23:00) より:
いや、ですからファイルに書き出したあとのタイミングで$_POST["NextForm"]と$nextFormをprintしてみられたんでしょうか?その時点で$_POST["NextForm"]と$nextFormには「¥」が入っていましたか?

引用:

$nextForm = stripslashes($_POST["NextForm"]);

上記の状態でも¥マークが入ってしまいました。


ということでしたが、この状態で$nextFormに「¥」があるとしたら、$_POST["NextForm"]は「¥¥」の状態ではないか・・ということを確認していただきたいのですが。


どういう作りになっているのかわかりませんが、よくあるのは実際のファイル書き出しの前の「確認画面」にhiddenで渡すときに$_POSTを(stripslashesせずに)そのまま渡してしまうというのがあります。foreachで$_POSTをLoop処理するだけになっていませんか?

・・っていうかそれは確認画面のhtmlソースを(ブラウザ側で)見ればわかることですよねぇ(汗


テキスト出力後でも¥マークが出ていました。

今回は単なる入力値なのでhiddenの項目ではありません。
また、一回だけの単純な$_POSTです。
ブラウザ側では他の文字はちゃんと表示(¥マークを出して)しています。

出来が悪く要領の悪い回答ばかりですみません。
お手数ばかりかけてすみません。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-01-21 01:52
引用:

tuchidaさんの書き込み (2008-01-20 23:57) より:
テキスト出力後でも¥マークが出ていました。


ということは

$nextForm = stripslashes($_POST["NextForm"]);

これが処理されていて、なおかつ$_POST["NextForm"]と$nextFormに同じように(ここ大事)「¥」が混入している状態でしょうか?

この文と、テキストファイルへの書き込み($nextFormを書き込んでいますよね?)以外で$nextFormを使っている箇所がないかソースを検索してみてください。

#$nextFormが見つかった行を全部提示していただいてもけっこうですが・・。


(蛇足)
過去のいくつかのスレッドで、解決したのかどうか不明なものが多いのですが、そのことについてはどうお考えですか?

[ メッセージ編集済み 編集者: shimix 編集日時 2008-01-21 01:57 ]

スキルアップ/キャリアアップ(JOB@IT)