jQuery ajax不像utf-8那样传输

时间:2012-07-16 00:41:03

标签: javascript jquery backbone.js character-encoding

我正在使用旧版本的backbone.js(0.5.3)和jQuery 1.7.2,当Backbone.sync执行时(它是jQuery $ .ajax()的包装器),它将contentType显式设置为:

params.contentType = 'application/json';

这看起来像我想要的,但内容似乎不是以utf-8形式发送的。我正在使用ndash进行测试,这是我的示例字符串:

Mathematics K–10

提交到服务器后,我得到:

Mathematics K–10

现在,如果我将contentType(在backbone.js中)更改为:

params.contentType = 'application/json; charset=utf-8';

一切都按预期工作,我得到了正确的ndash字符。如果我在骨干中注释掉原始的contentType行,这也是行为。

jQuery文档建议:

  

数据将始终使用UTF-8字符集

传输到服务器

但似乎如果你明确设置了你的contentType,那么你还需要设置一个字符集。

我的问题是,这种行为有意义吗?我原本以为我们总是希望默认为utf-8(如jQuery文档状态),即使我们明确地更改了contentType。有没有其他人遇到这个或有任何可能帮助我的信息?

2 个答案:

答案 0 :(得分:1)

您可以扩展ajax函数,为骨干ajax调用提供自定义标头,如上所述,

Backbone.ajax = (function(_protoAjax) {
    var _Backboneajax = _protoAjax;
    return function(options) {
        var defaultOptions = {
            headers: {
                "Accept": "application/json; charset=UTF-8",
                "Content-Type": "application/json; charset=UTF-8"
            }
        };
        options = $.extend({}, defaultOptions, options)
        return _Backboneajax.call(this, options);
    };
})(Backbone.ajax);  

或者你可以在所有JQuery Ajax调用上设置这个头文件(不仅仅是Backbone ajax调用),如上所述,

$.ajaxSetup({
    headers: {
        "Accept": "application/json; charset=UTF-8",
        "Content-Type": "application/json; charset=UTF-8"
    }
});

答案 1 :(得分:0)

HTTP spec表示内容类型设置了字符意义。也许jQuery文档应该更清楚。