gpt4 book ai didi

javascript - 在 http 响应 xml 中处理 unicode

转载 作者:行者123 更新时间:2023-11-29 22:30:41 25 4
gpt4 key购买 nike

我正在编写基于 myanimelist.net REST api 的 Google Chrome 扩展程序。有时 XMLHttpRequest 响应文本包含 unicode。


例如:

<title>Onegai My Melody Sukkiri&acirc;�&ordf;</title>


如果我从文本创建一个 HTML 节点,它看起来像这样:

Onegai My Melody Sukkiri�


然而,实际的标题是这样的:

Onegai My Melody Sukkiri♪


为什么我的文本没有正确呈现,我该如何解决?


更新

代码: background.html

我认为这些是关键部分:

function htmlDecode(input){
var e = document.createElement('div');
e.innerHTML = input;
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}

function xmlDecode(input){
var result = input;
result = result.replace(/</g, "&lt;");
result = result.replace(/>/g, "&gt;");
result = result.replace(/\n/g, "&#10;");
return htmlDecode(result);
}

进一步:

var parser = new DOMParser();
var xmlText = response.value;
var doc = parser.parseFromString(xmlDecode(xmlText), "text/xml");

最佳答案

<title>Onegai My Melody Sukkiri&acirc;�&ordf;</title>

亲爱的!不仅是错误的文本,它甚至不是格式正确的 XML。 acircordf是未在 XML 中预定义的 HTML 实体,然后它们之间存在无效的 UTF-8 序列(一个高字节,可能最初是 0x99)。

问题是 myanimelist 正在使用 PHP 函数 htmlentities() 生成它们的输出“XML”(但“如果格式不正确,则不是 XML”) .这不仅尝试对 HTML 中可能敏感的字符进行 HTML 转义 <&"' , 以及所有非 ASCII 字符。

这会生成错误的字符,因为 PHP 默认将输入处理为 htmlentities()作为 ISO-8859-1 而不是 UTF-8,这是他们实际使用的编码。但这是错误的开始,因为 HTML 实体集在 XML 中不存在。他们真正想用的是 htmlspecialchars() ,它只留下非 ASCII 字符,只转义真正敏感的字符。因为那些在 XML 中是敏感的,htmlspecialchars()对于 XML 和 HTML 一样有效。

htmlentities()几乎总是错的; htmlspecialchars()通常应改为使用。您可能希望将非 ASCII 字节编码为实体引用的一个地方是当您以纯 ASCII 输出为目标时。但即便如此htmlentities()失败,因为它没有为没有预定义实体名称的字符创建字符引用 ( &#...; )。很没用。

无论如何,您无法真正从中恢复损坏的数据。 表示对于 XMLHttpRequest 而言 UTF-8 不可解码的字节序列,因此信息无法挽回地丢失。您必须说服 myanimelist 按照以上几段修复损坏的 XML 输出,然后才能继续。

他们还应该将其作为 Content-Type: text/xml 返回不是 text/html就像现在一样。然后你可以拿起 responseXML直接来自 XMLHttpRequest 对象,而不是乱用 DOMParsers。

关于javascript - 在 http 响应 xml 中处理 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com