• 締切済み

PHPのフォーム送信時の文字化けについて

フォーム送信で、文字を送るときに、先頭のある特定の文字だけが文字化けして困っています。 文字化けする文字コードを調べてみたところ、 治(8ea1)から釈(8edf)までの2バイト文字が、 。(a1)から゜(df)までの1バイト文字に置き換わっていることがわかりました。 これらは、フォーム送信した文の途中では文字化けせず、先頭にあるときだけ文字化けしてしまいます。 この問題をどうやって回避すればいいのか、検討もつきません。 なにかヒントでもいいので、教えていただけないでしょうか?

みんなの回答

回答No.6

ImageTTFText ( $img, FONTSIZE, 0, $x, $y , $fntc, FONTTYPE, mb_convert_encoding($str, 'UTF-8', 'SJIS' ); とすると、「あ」→「縺a」 ImageTTFText ( $img, FONTSIZE, 0, $x, $y , $fntc, FONTTYPE, $str ); とすると、「治」→「。」(半角) となるということですよね? プログラム拝見しましたが、おかしいところは見つかりません。 ネットでちょっと調べても、PHPのバージョンアップで解消、configure時のオプション指定(--enable-gd-native-ttf)で解消、といった情報が少しあるだけで、よく判りません。 すみませんが、私には解決できそうもありません。 環境(OSやPHPのバージョンなど)を明記の上、再度新しく質問されたらいかがでしょう。お力になれずに、すみません。

kana2007
質問者

お礼

いえいえ、丁寧に回答していただき、本当にありがとうございました! fdsjaklfjasさんに教えていただいて、勉強になることがたくさんありました(*^_^*) 今回の件に関して何かわかりましたら、またここに書き込みたいと思います。

回答No.5

ImageTTFText($im, 20, 0, 11, 21, $grey, $font,        mb_convert_encoding($str, 'UTF-8', 'SJIS')); の部分を、 ImageTTFText($im, 20, 0, 11, 21, $grey, $font,        bin2hex($str)); にして「あ」を画面入力すると、画像に何が表示されますか? また、差し支えなければ、プログラムを補足欄などに載せてください。 その方が解決が早いかもしれませんので。

kana2007
質問者

補足

ImageTTFText($im, 20, 0, 11, 21, $grey, $font,        bin2hex($str)); とし、「あ」を入力しましたら、「82a0」と表示されました。 ソースは以下の通りです。 よろしくお願い致します(>_<) <?php // 表示する文字列 $str = stripslashes($_GET["txt"]); // 画像サイズ define ( IMGWID, 300 ); define ( IMGHEI, 300 ); // フォントサイズ define ( FONTSIZE, 20 ); // 文字のスタート位置 define ( START_X, 10 ); define ( START_Y, 50 ); // 生成画像 $img = imagecreatetruecolor ( IMGWID, IMGHEI ); // フォント色 $fntc = ImageColorAllocate ( $img, 255, 255, 255 ); // 使用するフォント define ( FONTTYPE, '../font/DFKaiE.ttf' ); // フォントパスの設定 putenv ( 'GDFONTPATH='.realpath('.') ); $x = START_X; $y = START_Y; // 入力された文字を書き出し ImageTTFText ( $img, FONTSIZE, 0, $x, $y , $fntc, FONTTYPE, $str ); header ( "Content-type: image/jpeg" ); ImageJpeg ( $img ); ImageDestroy ( $img ); ?>

回答No.4

>今度はページ全体が文字化けしてしまいました ImageTTFText($im, 20, 0, 11, 21, $grey, $font,        mb_convert_encoding($str, 'UTF-8', 'SJIS')); のように、【ImageTTFTextに与える文字列だけを】、UTF-8に変換します。他のところは【SJISのまま】にします。 そうした場合、どの部分に、どのような文字化けが生じるんでしょうか?

kana2007
質問者

補足

今までは、治(8ea1)から釈(8edf)までの2バイト文字だけが、 。(a1)から゜(df)までの1バイト文字に置き換わっていたのですが、 >ImageTTFText($im, 20, 0, 11, 21, $grey, $font,        mb_convert_encoding($str, 'UTF-8', 'SJIS')); 上記のように設定すると、フォームで受け渡す値は正しく表示されているのですが、画像として表示された文字は、 例えば、「あ」と入力すると、「糸連 a」と表示されてしまうんです。 ※上記は「糸」と「連」で一文字です。 当初からの文字化け文字であった「七」は「オ」ではなく「豆メ」になっています。 ※上記の「豆」の上に部首の草冠があります…。 こんな感じに、何を入力しても、画像として表示される部分だけはすべて、文字化けしてしまう状態です…(T_T)

回答No.3

>SJISで統一というのは変更せずに、なんとか問題を解決したいのですが…(>_<) ImageTTFTextにはUTF-8の文字列を与えなければなりません。 マニュアルを見てください。 http://jp.php.net/manual/ja/function.imagettftext.php 以下のように、ImageTTFText関数に与えるときにUTF-8にすればよいだけです。 ImageTTFText($im, 20, 0, 11, 21, $grey, $font,        mb_convert_encoding($str, 'UTF-8', 'SJIS'));

kana2007
質問者

補足

>ImageTTFTextにはUTF-8の文字列を与えなければなりません。 これは知りませんでした! ありがとうございます! >ImageTTFText($im, 20, 0, 11, 21, $grey, $font,        mb_convert_encoding($str, 'UTF-8', 'SJIS')); 上記のようにコンバートしてみましたが、今度は他の文字まで文字化けしてしまいました。 フォームの送信内容を表示するページのメタタグに <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> と入力しているのが原因かと思い、「Shift_JIS」を「utf-8」に変更したのですが、ダメでした…。 php.iniの設定も変更しないといけないんでしょうか? php.iniの設定に関しましても、「Shift_JIS」だったところを全部「utf-8」に変えたら、今度はページ全体が文字化けしてしまいました(>_<)

回答No.2

ImageTTFTextにはUTF-8に変換した文字列を与えていると思います。 変換の際に、 mb_convert_encoding($str, 'UTF-8', 'auto'); のように、「auto」でエンコーディングを自動認識させていると、同じ問題が起こるかもしれません。そうしているのならば、autoではなく、SJISなどを明示的に指定してください。

kana2007
質問者

補足

ご回答ありがとうございます! mb_convert_encodingに関しましては、以下のように設定してます。 mb_convert_encoding($str, 'SJIS', 'SJIS'); サイト内の文字コードは、すべてSJISに統一しているつもりなのですが、それが原因なんでしょうか…? SJISで統一というのは変更せずに、なんとか問題を解決したいのですが…(>_<)

回答No.1

>治(8ea1)から釈(8edf)までの2バイト文字が、 >。(a1)から゜(df)までの1バイト文字に置き換わっていることがわかりました。 PHPが、8ea1~8edfではじまる文字列を、EUCコードと認識しているのだと思います。 #EUCの8ea1をSJISに変換すると、a1になります。 恐らく、php.iniのmbstring.http_inputがauto(自動認識)になっていると思います。これをSJISに変更したら直ると思います。

kana2007
質問者

補足

回答ありがとうございます! php.iniの mbstring.http_input = auto を mbstring.http_input = SJIS 変更しましたところ、受け渡した文字は正常に戻りました! 実はそこから、さらにImageTTFText関数を使って画像としても表示させてるのですが、なぜか画像に書かれている最初の文字が文字化けしています。 文字化けのパターンは同じです。 使用しているフォントを変えてもダメでした。 なんでこうなるのかさっぱりわかりません…(T_T) なにか解決策はありませんでしょうか? ちなみにphp.iniの内容は以下の通りです。 ~php.ini ここから~ default_charset = Shift_JIS magic_quotes_gpc = On output_buffering = Off HTTP input encoding translation = on mbstring.detect_order = auto; mbstring.encoding_translation = on mbstring.http_input = SJIS mbstring.http_output = SJIS mbstring.internal_encoding = SJIS mbstring.language = Japanese mbstring.substitute_character = none ~php.ini ここまで~

関連するQ&A