如何使用javascript将特殊的UTF-8字符转换为iso-8859-1等效字符?

Hob*_*use 52 javascript jquery character-encoding

我正在制作一个javascript应用程序,它.json使用jquery 检索文件并将数据注入其嵌入的网页中.

这些.json文件采用UTF-8编码,并包含重音字符,如é,ö和å.

问题是我不控制将要使用该应用程序的页面上的charset.

有些人将使用UTF-8,但其他人将使用iso-8859-1 charset.这当然会从.json文件中剔除特殊字符.

如何使用javascript将特殊的UTF-8字符转换为iso-8859-1等效字符?

nit*_*k01 139

实际上,一切都通常在内部存储为某种类型的Unicode,但不要进入那个.我假设您正在使用标志性的"Ã¥Ã"类型字符串,因为您使用的是ISO-8859作为字符编码.有一个技巧可以转换这些字符.的escapeunescape用于编码和解码的查询字符串功能针对ISO字符定义的,而较新的encodeURIComponentdecodeURIComponent其做同样的事情,针对UTF8字符定义.

escape将扩展的ISO-8859-1字符(UTF代码点U + 0080-U + 00ff)%xx编码为(两位十六进制),而它将UTF代码点U + 0100及以上编码为%uxxxx(%u后跟四位十​​六进制).例如,escape("å") == "%E5"escape("?") == "%u3042".

encodeURIComponent百分比将扩展字符编码为UTF8字节序列.例如,encodeURIComponent("å") == "%C3%A5"encodeURIComponent("?") == "%E3%81%82".

所以你可以这样做:

fixedstring = decodeURIComponent(escape(utfstring));
Run Code Online (Sandbox Code Playgroud)

例如,编码错误的字符"å"变为"Ã¥".该命令执行escape("Ã¥") == "%C3%A5"哪两个错误的ISO字符编码为单个字节.然后decodeURIComponent("%C3%A5") == "å",将两个百分比编码的字节解释为UTF8序列.

如果你出于某种原因需要反向做,那也是有效的:

utfstring = unescape(encodeURIComponent(originalstring));
Run Code Online (Sandbox Code Playgroud)

有没有办法区分坏的UTF8字符串和ISO字符串?原来有.如果给定格式错误的编码序列,上面使用的decodeURIComponent函数将抛出错误.我们可以用它来检测我们的字符串是UTF8还是ISO.

var fixedstring;

try{
    // If the string is UTF-8, this will work and not throw an error.
    fixedstring=decodeURIComponent(escape(badstring));
}catch(e){
    // If it isn't, an error will be thrown, and we can assume that we have an ISO string.
    fixedstring=badstring;
}
Run Code Online (Sandbox Code Playgroud)

  • @nitro2k01:您的建议出现错误:`未捕获的 URIError:URI 格式错误` (4认同)
  • `escape`编码扩展ISO-8859-1字符(UTF代码点U + 0080-U + 00FF)作为'%xx`(两位十六进制),而其编码UTF码点U + 0100和如上`%uxxxx`( `%u`接着4位十六进制).例如,`逃逸( "A")== "%E5"`和`逃逸( "あ")== "%u3042"`.`encodeURIComponent`将扩展字符百分比编码为UTF8字节序列.例如,`encodeURIComponent方法( "A")== "%C3%A5"`和`encodeURIComponent方法( "あ")== "%E3%81%82"`.我希望能解决任何问题. (2认同)
  • 转义功能将被弃用!!https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape (2认同)
  • @Eyewritecode 我很高兴我能提供帮助,但我感到难过的是 10 年后我们仍然需要这个黑客...... (2认同)

Dio*_*ane 7

问题是,一旦页面被提供,内容将采用内容类型元标记中描述的编码."错误"编码中的内容已经出现乱码.

在提供页面之前,您最好在服务器上执行此操作.或者正如我所知道的那样:UTF-8端到端或死亡.


Eld*_*ell 5

由于如何从 ISO-8859-1 转换为 UTF-8的问题因此而结束,我将在这里发布我的解决方案。

问题是,当您尝试使用 XMLHttpRequest 获取任何内容时,如果 XMLHttpRequest.responseType 为“文本”或空,则 XMLHttpRequest.response 会转换为 DOMString,这就是问题所在。之后,几乎不可能可靠地使用该字符串。

现在,如果服务器的内容是 ISO-8859-1,您必须强制响应类型为“ Blob ”,然后将其转换为 DOMSTring。例如:

var ajax = new XMLHttpRequest();
ajax.open('GET', url, true);
ajax.responseType = 'blob';
ajax.onreadystatechange = function(){
    ...
    if(ajax.responseType === 'blob'){
        // Convert the blob to a string
        var reader = new window.FileReader();
        reader.addEventListener('loadend', function() {
           // For ISO-8859-1 there's no further conversion required
           Promise.resolve(reader.result);
        });
        reader.readAsBinaryString(ajax.response);
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎魔法正在readAsBinaryString上发生,所以也许有人可以解释为什么它有效。