jquery からデータをphpにPOSTで送信すると文字化けが発生してしまいます。


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で行なっています。

何かしらでエンコードされているためだとは思うのですが、これを元の日本語に戻すやり方がわかりません。お手数ですが何か対策をご存知の方はお教えいただけますでしょうか。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/01/24 15:35:20
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント81pt

只の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の内容を示したほうが解決が早いと思います。

id:n_maco2

ご回答ありがとうございます。なるほど、これはUtf-8の16進表記なのですね、確かに日本語文字列がブラウザに表示されました。
不勉強で申し訳ないのですが、これを通常の日本語の文字列データとして扱う手段をお教えいただけませんでしょうか。色々調べまわったのですが手段が見つからず・・

それとhogehoge.php側からjsに戻した値が文字化けするのは、hogehoge.phpから戻す文字列を通常の日本語の文字列を戻しても発生したので、別の問題がもう一個潜んでいそうです。こちら、改めて自分で調べて必要があれば再度投稿させていただきます。ありがとうございました。

2012/01/24 15:16:54
id:n_maco2

すみません、ちょっと多大な勘違いがあったようです・・
文字化けが発生するのでphp側でerror_log関数でデータを出力して確認していたのですが、そもそもerror_logにマルチバイトのデータを渡すと16進数でログに乗るんですね・・よって、そもそも16進数で渡ってきているわけではなかったようです。
大変お騒がせいたしました、お恥ずかしい限りです・・

ありがとうございました!

2012/01/24 15:34:40

その他の回答1件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント24pt

その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
id:n_maco2

ご回答ありがとうございます、おっしゃるとおりbase64_decodeをしてみたのですが、それを行うとマルチバイト文字が丸ごと空文字列になってしまいます・・
\xe6\x88\x90...といった文字列は、base64_encodeで生成される文字列とは大分傾向が違うように思うのですが、これはBase64なのでしょうか。

それと、ご提示いただいたmbstringの設定値ですが、当該フォルダの.htaccessに記載させていただきましたが、現象に変化はありませんでした。

諸々情報ありがとうございました。
他に何か試せることがありましたらお教えいただけますと幸いです。
よろしくお願いいたします。

2012/01/23 18:31:54
id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226ここでベストアンサー

ポイント81pt

只の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の内容を示したほうが解決が早いと思います。

id:n_maco2

ご回答ありがとうございます。なるほど、これはUtf-8の16進表記なのですね、確かに日本語文字列がブラウザに表示されました。
不勉強で申し訳ないのですが、これを通常の日本語の文字列データとして扱う手段をお教えいただけませんでしょうか。色々調べまわったのですが手段が見つからず・・

それとhogehoge.php側からjsに戻した値が文字化けするのは、hogehoge.phpから戻す文字列を通常の日本語の文字列を戻しても発生したので、別の問題がもう一個潜んでいそうです。こちら、改めて自分で調べて必要があれば再度投稿させていただきます。ありがとうございました。

2012/01/24 15:16:54
id:n_maco2

すみません、ちょっと多大な勘違いがあったようです・・
文字化けが発生するのでphp側でerror_log関数でデータを出力して確認していたのですが、そもそもerror_logにマルチバイトのデータを渡すと16進数でログに乗るんですね・・よって、そもそも16進数で渡ってきているわけではなかったようです。
大変お騒がせいたしました、お恥ずかしい限りです・・

ありがとうございました!

2012/01/24 15:34:40

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません