私は小さなチャットボックスを持っています。äöü のような特殊なラテン文字を送信することを除いて、すべてが機能しています。
これは、Enter キーが押されるとすぐに入力を送信する投稿です (ヘッダーではなく本文に配置され、ヘッダーに配置する方法がわかりませんでした --> vBulletin テンプレート):
<script type="text/javascript">
$("#shout").keypress(function(e) {
if(e.keyCode == 13) {
$.ajax({
url: "http://example.com/api.php",
contentType: "text/html; charset=ISO-8859-1",
data: {
action: "shout",
// This is what I found on the internet to
// encode the data, but didn't help.
message: $('<div />').text($("#shout").val()).html()
},
success: function() {
$("#shout").val("");
}
})
}
});
</script>
サーバー側
// Insert shout
case "shout":
if(isset($_GET['message']) && $_GET['message'] != "") {
$mc->insertShout($userid, mktime(), $_GET['message']);
}
break;
insertShout ロジック
public function insertShout($userid, $date, $message, $notification = 0) {
$sql = "INSERT INTO
vb_chatbox_shout (userid, dateline, message, message_raw, notification)
VALUES
(?, ?, ?, ?, ?)";
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $userid);
$stmt->bindParam(2, $date);
$stmt->bindParam(3, $message);
$stmt->bindParam(4, $message);
$stmt->bindParam(5, $notification);
if(!$stmt->execute()) {
var_dump($stmt->errorInfo());
}
return 1;
}
文字セットとして utf-8 を使用しようとしましたが、運がありません。また、投稿は役に立ちませんでした。この種の ajax を使用してチャットボックスのコンテンツをプルするのは魅力的です (phpmyadmin を使用して db に直接挿入された特殊文字が正しく表示されます)。
問題は、文字をデータベースに挿入することではありません。最初のエントリ ポイントで $_GET 変数をダンプすると、既にめちゃくちゃになっているため、問題は jQuery と PHP の間にあります。
新しいヘッダー
GET /api.php?action=shout&message=%25C3%25B6%25C3%25A4%25C3%25BC HTTP/1.1
Host: example.com
Connection: keep-alive
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5
Accept: */*
Referer: http://example.com/forum/forum.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: skimlinks_enabled=1; bb_lastvisit=1316066700; bb_lastactivity=0; bb_userid=1;
HTTP/1.1 200 OK
Date: Mon, 28 May 2012 17:26:14 GMT
Server: Apache
X-Powered-By: PHP/5.2.9
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8