【发布时间】:2012-04-03 17:35:52
【问题描述】:
更新:感谢 Rob W 指出代码没有问题。在传递 header() 时发现尚未定义 CHARSET 的后端错误。 IE 对此很敏感,而 Chrome 和 FF 则不敏感。
此案例可用于支持动态字符集的平台上的 AJAX 调用。
------
[原帖]
我认为 jQuery 为我们解决了浏览器的差异。我完全不知道为什么这在 Chrome 和 FF 中可以完美运行,但在 IE 中却不行。
在 Chrome 和 FF 中:
脚本完美地发布了一个 iso-8859-1 编码的 ajax 请求。结果是 iso-8859-1 编码并且返回很好。
在 IE9 中
在后端,根据(get_address.json.php)的头,我得到不同的结果:
// Throws readyState 0 error in IE.
header('Content-type: application/json; charset=iso-8859-1');
// Works in IE9 but strips foreign characters.
header('Content-type: application/json; charset=utf-8');
// Same result as utf-8 above
header('Content-type: application/json');
脚本:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$("input:button[name=get_address]").click(function() {
$.ajax({
url: "get_address.json.php",
type: "POST",
data: $("input:text[name=crn]").serialize(),
cache: false,
async: false,
dataType: "json",
beforeSend: function(xhr) {
xhr.overrideMimeType("application/x-www-form-urlencoded; charset=<?php echo CHARSET; ?>");
},
error: function(jqXHR, textStatus, errorThrown) {
alert(jqXHR.readyState + '\n' + textStatus + '\n' + errorThrown.message);
},
success: function(data) {
if (!data) {
alert("Error: No response");
return;
}
if (data.error) {
alert(data.error);
return;
}
$("input:text[name=firstname]").val(data.firstname);
$("input:text[name=lastname]").val(data.lastname);
$("input:text[name=street_address]").val(data.street);
$("input:text[name=postcode]").val(data.postcode);
$("input:text[name=city]").val(data.city);
},
complete: function() {}
});
});
});
</script>
<input type="text" name="crn"> <input type="button" name="get_address" value="Get Address" />
模拟 JSON 响应(带有 ISO-8859-1 外来字符):
<?php
header('Content-type: application/json; charset='. CHARSET);
echo '{"census":"1","protected":"0","crn":"19000000-1234","firstname":"Åke","lastname":"Jönsson","co":"","street":"Testvägen 1","postcode":"72344","city":"Göteborg"}';
?>
IE 中的错误 alert() 说:
[object Error]
error
[object Error]
我不喜欢转换字符集之类的解决方案,除非这是唯一可能的解决方案。后端是 osCommerce,纯粹是 iso-8859-1。
我们如何防止在没有字符转换的情况下对 iso-8859-1 内容抛出错误?
【问题讨论】:
-
你试过转换字符集吗?
-
在 IE6、7 和 8 中的作用就像一个魅力:jsfiddle.net/4cPes。你能显示生成的 HTML 代码吗?此外,不要提醒
errorThrown,而是使用errorThrown.message。这将显示更有用的错误消息... -
Rob W,感谢您确认这一点。这导致我在后端出现最烦人的简单错误。请参阅以下帖子。
标签: php jquery ajax internet-explorer character-encoding