我的博客软件的博文创建页面LightBlog使用 jQuery 通过 AJAX 发布内容。奇怪的是,当我通过 jQuery 提交中文字符(中文)时,它以 UTF-16 格式将其发送到服务器。当我禁用 jQuery AJAX 并使用 Firefox 进行 POST 时,它会以 UTF-8 格式发送,就像它应该的那样。
检查 Firebug,jQuery 发送以下内容:%u4E2D%u6587
,这显然是 URL 编码的 UTF-16。
Firefox 发送:%E4%B8%AD%E6%96%87
,这绝对是 URL 编码的 UTF-8。
jQuery 声称按照 W3 规范以 UTF-8 格式进行 POST,那么为什么它以 UTF-16 格式发送呢?
有问题的 jQuery 代码:
$('#create').submit(function() {
var inputs = [];
$('.cf', this).each(function() {
inputs.push(this.name + '=' + escape(this.value));
})
jQuery.ajax({
data: inputs.join('&'),
type: "POST",
url: this.getAttribute('action'),
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
timeout: 2000,
success: function(json) {
var r = jQuery.parseJSON(json);
alert(r.result);
}
})
return false;
})
相关的PHP代码,如果有人需要的话,位于此文件的第一个if
条件中:http://code.google.com/p/lightblog/source/browse/trunk/Sources/ProcessAJAX.php?r=521
最佳答案
UTF-16是从escape(this.value)
返回的,与jQuery无关。
尝试在控制台中运行escape("中文")
。
您应该使用 encodeURIComponent()
,它似乎会生成您期望的字符串(“%E4%B8%AD%E6%96%87”),
或
让 jQuery 通过将数据作为散列而不是字符串传递来完成所有编码部分。
...或
不要手动创建数据,而是尝试使用 $(".cf").serialize()
或 $(".cf").serializeArray()
获取 POST 字符串/数据数组。
关于php - 为什么 jQuery 使用 UTF-16 进行 POSTing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11093523/