【问题标题】:jQuery $.get() charset of reply when no header is set?jQuery $.get() 没有设置标题时的回复字符集?
【发布时间】:2008-12-01 09:11:06
【问题描述】:

我最近刚刚安装了Winamp Song Requester,这是一个 Winamp 网络歌曲请求插件,内置了最小的 HTTP CGI 服务器。

插件的作用是它运行一个网络服务器,提供一个带有一些特殊变量的 html 页面,它会根据请求(播放列表、请求队列、歌曲剩余时间等)替换为实际数据。

我认为这是一个学习一些 jQuery 的有趣而好的项目,所以我开始连接我自己的 js 代码来替换、修复和 ajaxify 从插件提供的网站,但我现在遇到了字符编码的问题。

在页面上,您可以获得播放列表中所有歌曲的链接。当您单击其中一个链接时,我连接了我自己的 jQuery 单击功能。因此,当您请求一首歌曲时,我不会重新加载整个页面,而是使用 $.get($(this).attr('href', function(response) {... code ...}),然后我使用 replaceWith 将当前队列替换为新生成的队列,并即时添加您的请求。我做同样的事情来显示/更新当前播放和搜索,以便在后台获取所有内容,然后动态替换添加一些动画。

所有 jQuery/Ajax 都很好用,但我遇到的最大问题是字符集和队列/播放列表中的歌曲名称。名称中的特殊字符(åäöé 等)根本不起作用。

插件以 iso-8859-1/latin1 输出所有内容,我在标记中的元标记告诉浏览器此页面是 latin1。在浏览器中正常的页面刷新时,效果很好,特殊字符正常显示。但是当我使用 jQuery 和 $.get() 动态替换代码块时,特殊字符只显示为 ?.

我认为问题在于如果没有标头另有说明,jQuery 默认认为$.get() 响应是 UTF-8。该插件根本没有为编码/字符集设置任何标头,因为我无法控制所有后端以及设置了哪些标头,所以我无法更改它。

我在插件响应中得到的唯一标题是:

服务器:WinampServer
连接:关闭
内容类型:text/html

我希望你能理解我的问题。我有一个页面,我完全无法控制后端,我需要处理的只是生成的 HTML。我无法在回复中更改或添加标题。我需要告诉 jQuery 响应实际上是 latin1 而不是 UTF-8,这样特殊字符的编码就不会中断。我已经在 jQuerys ajaxSetup 中尝试了 scriptCharset: 'iso-8859-1' ,但这仅适用于 script/json 类型,并且我正在使用 HTML 响应。

知道这是否可行或您可以考虑的任何其他解决方法吗?

【问题讨论】:

    标签: jquery character-encoding


    【解决方案1】:

    编辑:好的,我认为这可行(至少它在我的测试环境中有效,请参阅先前尝试的修订)

    $.ajaxSetup({
        'beforeSend' : function(xhr) {
            xhr.overrideMimeType('text/html; charset=UTF-8');
        },
    });
    $('#stuff').load('/yourresource.file'); // your ajax load
    

    我拥有的是UTF-8 中设置的主文件和ISO-8859-1 中设置的数据文件。没有上面的代码,我得到了一堆垃圾测试字符串 åäöé,正如预期的那样。使用上面的代码,它加载了正确编码的 åäöé

    【讨论】:

    • 我也试过了,但这似乎没有帮助。我认为这只设置了您发送的数据的编码,而不是响应中收到的数据的编码。
    • 哇,非常非常非常感谢。这就像一个魅力。我准备放弃并接受无法解决我的问题。花了很多时间尝试不同的事情并在谷歌上搜索解决方案。当我将字符集设置为 iso-8859-1 时,您的 beforeSend 效果很好。
    • 糟糕的是,这对 IE 不起作用。 SO帖子中的最佳解决方案:link
    【解决方案2】:

    首先,如果您使用更通用的 $.ajax() 函数会更好。

    根据documentation 有scriptCharset 选项,但它仅适用于某些数据类型。也说明只有调用页面的编码不同时才需要这样做。

    【讨论】:

      【解决方案3】:

      这只是为了指出虽然 overrideMimeType() 方法在基于 Gecko 的浏览器(Firefox,...)中可用,但在 IE 中不可用(至少

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多