jquery 側は下記のようなコードになっています。
$.ajax({
type: "POST",
url : "hogehoge.php",
data: { 'moge':'日本語のテキスト' },
success: function(request) {
$("#view").empty().append(request);
}
});
このjqueryでテキストを送信すると、hogehoge.php側では日本語部分が「 \xe6\x88\x90\xe7\x8a\xac\xe3\x81\xae\xe4\xbd\x93\xe9\x87\x8d」のような、16進数?の文字列になって出てきてしまいます。
※文字コードはいずれもUTF-8で行なっています。
何かしらでエンコードされているためだとは思うのですが、これを元の日本語に戻すやり方がわかりません。お手数ですが何か対策をご存知の方はお教えいただけますでしょうか。
よろしくお願いいたします。
只のUT8文字列の16進表記ですね。↓のようにすれば「成犬の体重」と表示されます。
<?php echo "\xe6\x88\x90\xe7\x8a\xac\xe3\x81\xae\xe4\xbd\x93\xe9\x87\x8d";
質問のjqueryの呼び出しも適当なサンプルコードで試して診ましたがjqueryは普通にutf-8で送っており、php側でも普通にutf-8文字列として受け取れてます。
hogehoge.phpが受け取った値をどうやって返してるか知りませんがもしかしたら何か変なJSONエンコーダのようなものを使って値を出力したりしてたりしないでしょうか?
問題が再現する最小限のhogehoge.phpの内容を示したほうが解決が早いと思います。
その16進数はBase64エンコーディングされているようですので、PHP側でbase64_decode関数を使ってUTF-8文字列にデコードしてみてください。
文字化けの原因ですが、php.iniの設定が以下のようになっているかどうかご確認ください。
mbstring.language = Japanese mbstring.input_encoding = pass mbstring.internal_encoding = UTF-8 mbstring.http_input = pass mbstring.http_output = UTF-8 mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none
ご回答ありがとうございます、おっしゃるとおりbase64_decodeをしてみたのですが、それを行うとマルチバイト文字が丸ごと空文字列になってしまいます・・
\xe6\x88\x90...といった文字列は、base64_encodeで生成される文字列とは大分傾向が違うように思うのですが、これはBase64なのでしょうか。
それと、ご提示いただいたmbstringの設定値ですが、当該フォルダの.htaccessに記載させていただきましたが、現象に変化はありませんでした。
諸々情報ありがとうございました。
他に何か試せることがありましたらお教えいただけますと幸いです。
よろしくお願いいたします。
只のUT8文字列の16進表記ですね。↓のようにすれば「成犬の体重」と表示されます。
<?php echo "\xe6\x88\x90\xe7\x8a\xac\xe3\x81\xae\xe4\xbd\x93\xe9\x87\x8d";
質問のjqueryの呼び出しも適当なサンプルコードで試して診ましたがjqueryは普通にutf-8で送っており、php側でも普通にutf-8文字列として受け取れてます。
hogehoge.phpが受け取った値をどうやって返してるか知りませんがもしかしたら何か変なJSONエンコーダのようなものを使って値を出力したりしてたりしないでしょうか?
問題が再現する最小限のhogehoge.phpの内容を示したほうが解決が早いと思います。
ご回答ありがとうございます。なるほど、これはUtf-8の16進表記なのですね、確かに日本語文字列がブラウザに表示されました。
不勉強で申し訳ないのですが、これを通常の日本語の文字列データとして扱う手段をお教えいただけませんでしょうか。色々調べまわったのですが手段が見つからず・・
それとhogehoge.php側からjsに戻した値が文字化けするのは、hogehoge.phpから戻す文字列を通常の日本語の文字列を戻しても発生したので、別の問題がもう一個潜んでいそうです。こちら、改めて自分で調べて必要があれば再度投稿させていただきます。ありがとうございました。
すみません、ちょっと多大な勘違いがあったようです・・
文字化けが発生するのでphp側でerror_log関数でデータを出力して確認していたのですが、そもそもerror_logにマルチバイトのデータを渡すと16進数でログに乗るんですね・・よって、そもそも16進数で渡ってきているわけではなかったようです。
大変お騒がせいたしました、お恥ずかしい限りです・・
ありがとうございました!
ご回答ありがとうございます。なるほど、これはUtf-8の16進表記なのですね、確かに日本語文字列がブラウザに表示されました。
2012/01/24 15:16:54不勉強で申し訳ないのですが、これを通常の日本語の文字列データとして扱う手段をお教えいただけませんでしょうか。色々調べまわったのですが手段が見つからず・・
それとhogehoge.php側からjsに戻した値が文字化けするのは、hogehoge.phpから戻す文字列を通常の日本語の文字列を戻しても発生したので、別の問題がもう一個潜んでいそうです。こちら、改めて自分で調べて必要があれば再度投稿させていただきます。ありがとうございました。
すみません、ちょっと多大な勘違いがあったようです・・
2012/01/24 15:34:40文字化けが発生するのでphp側でerror_log関数でデータを出力して確認していたのですが、そもそもerror_logにマルチバイトのデータを渡すと16進数でログに乗るんですね・・よって、そもそも16進数で渡ってきているわけではなかったようです。
大変お騒がせいたしました、お恥ずかしい限りです・・
ありがとうございました!