IE 无法将响应标头(来自 ajax)打印为 utf8

IE cant print response header (from ajax) as utf8

本文关键字:ajax 来自 打印 utf8 响应 IE      更新时间:2023-09-26

我使用 PJAX 更改我网站上的页面,对于每个新页面,我都会发送带有新 a Page-Title 标头的Response Header。此标头包含可以包含 åäö,并且 IE 错误地输出此内容。在IE的开发人员工具中,我可以毫无问题地看到Page-Title响应,但是当我使用document.title = ...更新标题时,它显示错误。

我的响应标头如下所示: Page-Title: Mårtensson

UTF8 已确认,我可以在 IE 和 Chrome 的开发工具中看到Content-Type: text/html; chartset=UTF-8

这是我更新标题的方式:

$.ajax({
    url: State.url,
    type: 'get',
    beforeSend: function(xhr){ 
        xhr.setRequestHeader('X-PJAX', true); 
    },
    success: function(resp, status, xhr) { 
        document.title = xhr.getResponseHeader('Page-Title');
        // other code
    }
});

这在 Chrome 中有效,但在 IE 中它输出为 MÃ¥rtensson .如果我使用decodeURIComponent(escape(document.title = xhr.getResponseHeader('Page-Title')));它在IE中输出正常,但是在Chrome中我会得到Uncaught URIError: URI malformed.

如何让它在两个浏览器中都工作?


溶液

在将其输出为响应标头之前,我通过在字符串上运行 htmlentities 来修复它。然后,我在 javascript 中解码字符串,然后再将其设置为标题。

document.title = decodeEntities(xhr.getResponseHeader('Page-Title'));

您可以查看专门处理此问题的RFC 5987。基本上,请记住,如果您在 HTTP 标头字段中使用 UTF-8 字符,则您只能靠自己,不同的浏览器将具有不同的行为。

如果您确实需要为此使用标头,则应使用某种转义(服务器端)和取消转义(客户端)来使您的游戏适合 ISO-8859-1 字符集。