gpt4 book ai didi

javascript - 在 Javascript 中将 ISO/Windows 字符集转换为 UTF-8

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

我正在开发一个 firefox 插件,我获取网页为用户做一些分析。问题是当我尝试获取非 utf-8 编码的 (XMLHttpRequest) 页面时,我看到的字符串被弄乱了。例如带有 windows-1125 的希伯来语页面或带有 gb2312 的中文页面。

我已经尝试过以下方法:

var uDecoder=Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].getService(Components.interfaces.nsIScriptableUnicodeConverter);
uDecoder.charset="windows-1255";
alert( xhr.responseText );

var decoder=Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService);

alert(decoder.convertStringToUTF8(xhr.responseText,"WINDOWS-1255",true));

我也试过 escape/unescape/encodeURIComponent

有什么想法吗???

最佳答案

一次XMLHttpRequest尝试使用 UTF-8 解码非 UTF-8 字符串,您已经迷路了。页面中不是有效 UTF-8 序列的字节序列将被损坏(通常转换为 ,即 U+FFFD 替换字符)。再多的重新编码/解码也无法恢复它们。

指定 Content-Type: text/html;charset=something 的页面HTTP header 应该没问题。没有真正的 HTTP header 但有 <meta> 的页面它的版本不会,因为XMLHttpRequest不知道如何解析 HTML,所以它看不到元数据。如果你事先知道你想要的字符集,你可以告诉 XMLHttpRequest它将使用它:

xhr.open(...);
xhr.overrideMimeType('text/html;charset=gb2312');
xhr.send();

(这是当前非标准化的 Mozilla 扩展。)

如果你事先不知道字符集,你可以请求一次页面,用一个 <meta> 的标题进行破解。字符集,将其解析出来并使用新的字符集再次请求。

理论上,您可以在单个请求中获得二进制响应:

xhr.overrideMimeType('text/html;charset=iso-8859-1');

然后将其从 bytes-as-chars 转换为 UTF-8。然而,iso-8859-1对此不起作用,因为浏览器将该字符集解释为真的是 Windows 代码页 1252。

您可以使用另一个将每个字节映射到一个字符的代码页,并进行大量繁琐的字符替换以将该代码页中的每个字符映射到它在真实 ISO-8859-1 中的字符,然后执行转换。大多数编码不会映射每个 字节,但阿拉伯语 (cp1256) 可能是这个的候选者?

关于javascript - 在 Javascript 中将 ISO/Windows 字符集转换为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2674411/

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