• 締切済み

「¥」余分な文字が入ってしまう

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

  • PHP
  • 回答数3
  • ありがとう数3

みんなの回答

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.3

>うーん。いつ頃の話でしょうか? 最新版は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の方は、ちゃんと動いてるから気にしないでいいかな?)

webwebwebweb
質問者

お礼

コードは正しい状態でした。 原因は、php_flag magic_quotes_gpcでした。 これがONになっているとプログラムでエスケープする必要がなくなりますが、今回のページではSQLを使っていないので この設定が必要ありませんでした。 お2方、ありがとうございました。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

ANo.1さん >htmlspecialcharsはシフトJISに対応してないけど。 うーん。いつ頃の話でしょうか? http://jp2.php.net/manual/ja/function.htmlspecialchars.php いずれにしても「htmlspecialcharsでencodingを指定していない」のはマズイですけどね。

webwebwebweb
質問者

お礼

なるほど これは核心に近いかもしれないです。 ありがとうございます。

webwebwebweb
質問者

補足

//全角カナを半角カナに変換 $str = mb_convert_kana( $str, 'k', "shift-jis" ); //全角英数字を半角英数字に変換 $str = mb_convert_kana( $str, 'a', "shift-jis" ); $strが返り値になり、require_onceで呼び出されたテンプレートに書き出されます。 該当箇所のコードです。 いかがでしょうか? ちなみに、質問に書き忘れましたが、モバイルサイトでPCユーザーは基本的に来れない仕様です。

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.1

htmlspecialcharsはシフトJISに対応してないけど。 「代表者」の「表」は、シフトJISだと第2バイトが「¥」なので、普通に「¥」が含まれた文字列として処理されて「表」が「表¥」にエスケープされてしまう。 $encodingを"UTF-8"に指定した上でunicodeに変換した文字列をhtmlspecialcharsに与えましょう。 ともかく、htmlspecialcharsにシフトJIS文字列を与えてはいけません。

webwebwebweb
質問者

お礼

なるほどでは SJIS(ユーザーが送信するとき)→UTF8(内部で変更するとき)→SJIS(ユーザーに返すとき) このようなプログラムに変えればうまくいくのですかね? そんなに手間はかからなそうですし、ちょっと試してみますね。

webwebwebweb
質問者

補足

ANo.2さんの捕捉で間違ってmb_convert_kanaの部分を書いてしまいました。 お二人とも、すみません。 該当箇所は、 $_POST[$key][0] = htmlspecialchars( $_POST[$key][0] ); このような感じでANo.2さんの注意点にもある エンコーディングを指定していないですね。

関連するQ&A

  • phpmyadminで文字化け

    こんにちは、 現在、php5,mysql4で構築しているのですが、 phpmyadminでテーブルに入れた日本語を見ると 文字化けを起こしており、 たぶん、default_charsetだと思うのですが、 何を設定すればよいのでしょうか? MYSQL4 UTF-8 PHP5 mbstring.detect_order auto mbstring.encoding_translation Off mbstring.func_overload 0 mbstring.http_input auto mbstring.http_output SJIS mbstring.internal_encoding EUC-JP mbstring.language Japanese mbstring.script_encoding no value mbstring.substitute_character no value default_charset no value

    • 締切済み
    • PHP
  • PHP 文字コードについて

    以下のような環境のホスティングサーバでSmartyを使い簡単なアプリを作っています。 サーバ PHP Version 4.3.7 phpinfoの値 mbstring.detect_order auto mbstring.encoding_translation On mbstring.func_overload 0 mbstring.http_input auto mbstring.http_output SJIS mbstring.internal_encoding EUC-JP mbstring.language Japanese mbstring.script_encoding auto mbstring.substitute_character no value 今回、PHPソースはUTF-8、HTML(Smartyテンプレ)もUTF-8で作っています(作りたいです)。 この様な場合、PHPスクリプトに「ini_set」を記述するのが良いのか、又は$_POST等で受け取ったときに毎回「mb_convert_encoding」記述するのが良いのか、その両方か、アドバイスを頂きたいです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • FORMからの文字入力文字化け

    「.htaccess」で設定した場合、正常に動作するのですが、「自作スクリプト内」でPHP環境を設定すると文字化けします。 フリーの掲示板が「.htaccess」で設定した場合、文字化けしますので、自作スクリプトも今回からスクリプト内部からPHP環境を設定し動作確認をしています。 FORMからの文字入力だけが文字化けしてしまうのですが、解決方法が見出せずに困っています。 また、「mbstring.encoding_translation」の設定方法がわからずに設定していないため、入力文字化けするのでしょうか。 表示だけは、文字化けせずに表示されます。FORMからの入力文字だけが文字化けします。 解決方法をご存知の方がいらっしゃいましたらご教授のほど宜しくお願いします。 # .htaccessで設定する場合 php_flag output_buffering "On" php_value output_handler "mb_output_handler" php_value default_charset "Shift_JIS" php_value mbstring.language "Japanese" php_value mbstring.internal_encoding "EUC-JP" php_value mbstring.http_input "auto" php_value mbstring.http_output "SJIS" php_value mbstring.detect_order "auto" php_flag mbstring.substitute_character "none" php_flag mbstring.encoding_translation "On" # 自作スクリプト内で設定する場合 ini_set("output_buffering", "On"); ini_set("output_handler", "mb_output_handler"); ini_set("default_charset", "Shift_JIS"); mb_language("Japanese"); mb_internal_encoding ("EUC-JP"); mb_http_input("auto"); mb_http_output("SJIS"); mb_detect_order("auto"); mb_substitute_character("none"); ob_start("mb_output_handler");

    • 締切済み
    • PHP
  • カタカナ小文字「ァ」の、検索時の文字化けで困っています。

    はじめまして。 現在、検索結果が表示されるページを制作しているのですが、その際、 カタカナ小文字の「ァ」が入っているキーワードで検索したときに、 検索キーワードの表示のところで、下記のように文字化けが起こってしまって、困っています。 (「ヴァージニティ」→「ヴ 璽献縫謄 」) Google検索しても、解決法を見つけることができませんでした。 magic_quotes_gpcの設定は、開発環境ではOff、本番環境ではOn(レンタルサーバのデフォルトの設定)にしているのですが、 if (isset($_GET['keyword'])) { $keyword = (get_magic_quotes_gpc()) ? $_GET['keyword'] : mysql_escape_string($_GET['keyword']); $keyword = mb_convert_kana($keyword, "aKV"); } のように、magic_quotes_gpcの設定が「ON」であるときと「OFF」であるときの両方の設定を記述しています。 PHP、データベース共に文字コードはEUCで統一しています。 レンタルサーバなので.htaccessを使用して、下記のように設定しています。 php_flag output_buffering off php_value default_charset EUC-JP php_value mbstring.language Japanes php_flag mbstring.encoding_translation on php_value mbstring.http_input EUC-JP php_value mbstring.http_output EUC-JP php_value mbstring.internal_encoding EUC-JP php_value mbstring.substitute_character none php_value mbstring.detect_order EUC-JP,SJIS,JIS,UTF-8,ASCII 文字化けが生じる、表示部分のphpの記述ですが、 if($keyword != ""){ $keyword = mb_convert_encoding($keyword, "EUC-JP"); echo htmlspecialchars(stripslashes($keyword)); } のように記述しています。 ちなみに、「ッ」のような他のカタカナ小文字が入っているキーワードでは、正常に検索結果が表示されます。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字化けの原因を教えてください。

    WindowsでスクリプトをEUCで保存し、シフトJISでブラウザへ出力ときの 設定として以下のようにphp.iniを設定しています。 ~php.ini~ output_buffering = On output_handler = mb_output_handler magic_quotes_gpc = Off default_charset = Shift_JIS extension_dir = C:/php/ext extension=php_mbstring.dll mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none ~php.ini~ mb_detect_encodingでDBから取得した値の文字コードは、SJISでした。 mb_convert_encoding($dbdata,"EUC-JP","SJIS")で正しく表示されます。 iniファイルの設定のみで正しく表示するにはどのように設定するのがいいのでしょうか?それとも、このような文字コード変換は必須なのでしょうか? よろしくお願いします。 [PHP使用環境] PHP=5.1.6 OS=Windows2000 PRO webserver=apatch2.0 [DB環境(リモートサーバ)] DB=MS SQL Server2000 OS=Windows2003 server R2

    • 締切済み
    • PHP
  • PHPがローカル環境でのみ文字化けする

    PHPをApache2.0上でローカルテストすると、ブラウザ表示がどうにも文字化けしてしまいます。 EUCで組んだスクリプトをmb_convert_encodingでSJISに変換して出力しているのですが、本番用のサーバーではきちんと動作するのに、ローカル環境ではブラウザがEUCと認識してしまっているようで、文字化けが発生します。 99%php.iniかapacheの設定がおかしいのですが、どこがおかしいか見てはいただけないでしょうか。 php.iniのそれっぽい部分 mbstring.encoding_translation = Off mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none; ;mbstring.func_overload = 0 なお、Apacheのhttpd.confにAddDefaultCharset項目はありませんでした。 特殊要因としてApacheがXAMPPの中で制御されていることなのですが、php.iniはApacheのbinディレクトリ内のものを編集しています。 以上です。 どうかよろしくお願いします。 WinXP SP3 PHP 5.28 Apache 2.0 XAMPP 1.7.0 ※ApacheとXAMPPはPleiadesにてEclipseを導入したときについてきたもの。

    • ベストアンサー
    • PHP
  • PHP 入力値 文字化け

    phpでFormで入力した値(日本語)が文字化けしてしまいます。 環境は WinXp pro apache2.0.59 php 4.4.7 php.iniのおもな設定ですが、 mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none; ブラウザからすべてShiftJisで入力されているのですが、 それがうまく EUC-JPに内部エンコードされていません。 mb_convert_encording($str,"EUC-JP","auto")をスクリプト内で 記述するとうまく表示されますが、なんとか設定で文字化けしないよう にできないでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • 日本語が使いたいのですが[mbstring]設定がわかりません

    環境は winxp sp2 apache 2.0.54 php 5.0.4 argosoftmailserver php.iniの設定は [mbstring] mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none です。足らない事があればお願いします。 下はphpの文です。 <?php $subject = "テスト"; $message = "あいうえお"; $test="日本語エンコーディングテスト"; print "$test (" . mb_detect_encoding($test) . ")<br>"; print ("mbstring.http_input=". mb_http_input() ."<br>"); print ("mbstring.http_output=". mb_http_output() ."<br>"); print ("mbstring.internal_encoding= ".mb_internal_encoding()."<br>"); $subject = mb_convert_encoding($subject, "SJIS", "EUC-JP"); $message = mb_convert_encoding($message , "SJIS", "EUC-JP"); mb_language("Japanese"); $chk = mb_send_mail('******@*******',$subject,$message,'From:***@******.dyndns.org'); if($chk==FALSE) { print "送信失敗"; } else { print "送信完了"; } ?> エンコードテストの結果は以下です。 日本語エンコーディングテスト (SJIS) mbstring.http_input= mbstring.http_output=SJIS mbstring.internal_encoding= EUC-JP よろしくお願いします。

    • ベストアンサー
    • PHP
  • mb_convert_encoding で 一部の文字が変換できない。

    こんにちは、初めて質問させていただきます。 PHPでテキストファイルに保存されたEUC-JPの文字列情報を UTF-8で表示しようとしています。 第一水準、第二水準程度の日本語は問題なく変換ができてるのですが、 「(7)」や「VII」などの特殊な記号文字が変換できないようです。 これは mb_convert_encoding の仕様なのでしょうか? ご存知でしたらご教授お願いいたします。 【ソース】 $buffer = "マル4→(4) ギリシャ4→IV 郵便番号→〒 株式会社→(株) \n"; echo mb_convert_encoding($buffer, "utf-8", "euc-jp"); 【出力結果】 マル4→? ギリシャ4→? 郵便番号→〒 株式会社→? 【環境情報】 Linux (OS、バージョン詳しくは分かりません。) PHP Version 4.3.9 mbstring.detect_order      no value mbstring.encoding_translation  Off mbstring.func_overload      0 mbstring.http_input       pass mbstring.http_output       pass mbstring.internal_encoding    EUC-JP mbstring.language        Japanese mbstring.script_encoding     no value mbstring.substitute_character  no value (Local Value、Master Value 共に同値です。)

    • ベストアンサー
    • PHP
  • UTF-8で文字化け

    いつもお世話になっております。 全てのファイルをEUC-JP で作成しております。 Googleマップを使用することになり、1ページだけ UTF-8 で出力したいと思います。 php.ini の設定は以下のようになっております。 -------------------------------------------------- default_charset EUC-JP mbstring.detect_order no value mbstring.encoding_translation Off mbstring.func_overload 0 mbstring.http_input pass mbstring.http_output EUC-JP mbstring.internal_encoding EUC-JP mbstring.language Japanese mbstring.substitute_character no value -------------------------------------------------- Googleマップを出力するページで以下のようにしたのですが 文字化けが直りません。 map.php -------------------------------------------------- ini_set("default_charset", "UTF-8"); mb_internal_encoding("UTF-8"); 他に設定する箇所はありますでしょうか。 よろしくご教示お願いいたします。 <環境> PHP:4.3.1

    • ベストアンサー
    • PHP