- 締切済み
「¥」余分な文字が入ってしまう
phpのバージョンは4.3.9 サーバーはアパッチ2です。 phpでmb_convert_kanaとhtmlspecialcharsを使ったフォームプログラムを作りました。 mb_convert_kanaは携帯電話でカタカナや記号を半角にするために、 htmlspecialcharsはPOSTから来たデータをエスケープするために使いました。 解決したいエラーは「代表者」という文字が「代表\者」というように 余分なバックスラッシュが入ってしまうことです。 .htaccessには以下のようなコードを入れています。 php_value default_charset Shift_JIS php_value default_mimetype "application/xhtml+xml" php_value mbstring.language Japanese php_value mbstring.encoding_translation On php_value mbstring.http_input auto php_value mbstring.http_output SJIS php_value mbstring.internal_encoding SJIS php_value mbstring.substitute_character none
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>うーん。いつ頃の話でしょうか? 最新版はSJISに対応してたのね…。 昔やった時はSJISが上手く行かなくてUTF-8に変換して使ってた(SJISだと、外字領域のコードが化ける、と言う弊害もあったし) htmlspecialcharsの第3引数に「'Shift_JIS'」って指定するだけで直ると思いますよ>質問者さん >$str = mb_convert_kana( $str, 'k', "shift-jis" ); >$str = mb_convert_kana( $str, 'a', "shift-jis" ); 「"shift-jis"」って有効なのかな? htmlspecialcharsの第3引数と同じように「'Shift_JIS'」って指定しないといけないような気がする(けど、mb_convert_kanaの方は、ちゃんと動いてるから気にしないでいいかな?)
- shimix
- ベストアンサー率54% (865/1590)
ANo.1さん >htmlspecialcharsはシフトJISに対応してないけど。 うーん。いつ頃の話でしょうか? http://jp2.php.net/manual/ja/function.htmlspecialchars.php いずれにしても「htmlspecialcharsでencodingを指定していない」のはマズイですけどね。
お礼
なるほど これは核心に近いかもしれないです。 ありがとうございます。
補足
//全角カナを半角カナに変換 $str = mb_convert_kana( $str, 'k', "shift-jis" ); //全角英数字を半角英数字に変換 $str = mb_convert_kana( $str, 'a', "shift-jis" ); $strが返り値になり、require_onceで呼び出されたテンプレートに書き出されます。 該当箇所のコードです。 いかがでしょうか? ちなみに、質問に書き忘れましたが、モバイルサイトでPCユーザーは基本的に来れない仕様です。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
htmlspecialcharsはシフトJISに対応してないけど。 「代表者」の「表」は、シフトJISだと第2バイトが「¥」なので、普通に「¥」が含まれた文字列として処理されて「表」が「表¥」にエスケープされてしまう。 $encodingを"UTF-8"に指定した上でunicodeに変換した文字列をhtmlspecialcharsに与えましょう。 ともかく、htmlspecialcharsにシフトJIS文字列を与えてはいけません。
お礼
なるほどでは SJIS(ユーザーが送信するとき)→UTF8(内部で変更するとき)→SJIS(ユーザーに返すとき) このようなプログラムに変えればうまくいくのですかね? そんなに手間はかからなそうですし、ちょっと試してみますね。
補足
ANo.2さんの捕捉で間違ってmb_convert_kanaの部分を書いてしまいました。 お二人とも、すみません。 該当箇所は、 $_POST[$key][0] = htmlspecialchars( $_POST[$key][0] ); このような感じでANo.2さんの注意点にもある エンコーディングを指定していないですね。
お礼
コードは正しい状態でした。 原因は、php_flag magic_quotes_gpcでした。 これがONになっているとプログラムでエスケープする必要がなくなりますが、今回のページではSQLを使っていないので この設定が必要ありませんでした。 お2方、ありがとうございました。