jQuery $ .get()没有设置标头时的回复字符集?

时间:2008-12-01 09:11:06

标签: jquery character-encoding

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

该插件的作用是运行一个Web服务器,提供一个带有一些特殊变量的html页面,它取代了请求中的实际数据(播放列表,请求队列,歌曲剩余时间等)。

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

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

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

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

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

我从插件获得的响应中唯一的标题是:

  

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

我希望你理解我的问题。我有一个页面,我无法控制后端,我必须使用的是生成的HTML。我无法在响应中更改或添加标头。我需要告诉jQuery,响应实际上是在latin1而不是UTF-8,因此特殊字符的编码不会中断。我在jQuerys ajaxSetup中尝试过scriptCharset:'iso-8859-1',但这只适用于脚本/ json类型,我正在使用HTML响应。

是否有可能或任何其他可以考虑的解决方法?

3 个答案:

答案 0 :(得分:28)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这只是要指出虽然在基于Gecko的浏览器(Firefox,...)中可以使用overrideMimeType()方法,但它不在IE中(至少< = 7),并且似乎存在没有解决方法。 (我不知道其他浏览器的可用性。)