6

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

该插件的作用是它运行一个 Web 服务器,提供一个带有一些特殊变量的 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 响应。

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

4

3 回答 3

29

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

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

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

于 2008-12-01T09:51:09.127 回答
0

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

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

于 2008-12-01T11:16:45.973 回答
0

This is just to point out that while the overrideMimeType() method is available in Gecko-based browsers (Firefox, ...), it is NOT in IE (at least <=7), and there appears to be no workaround. (I don't know about availability in other browsers.)

于 2008-12-11T15:35:09.753 回答