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作为字符编码.有一个技巧可以转换这些字符.的escape
和unescape
用于编码和解码的查询字符串功能针对ISO字符定义的,而较新的encodeURIComponent
和decodeURIComponent
其做同样的事情,针对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)
问题是,一旦页面被提供,内容将采用内容类型元标记中描述的编码."错误"编码中的内容已经出现乱码.
在提供页面之前,您最好在服务器上执行此操作.或者正如我所知道的那样:UTF-8端到端或死亡.
由于如何从 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上发生,所以也许有人可以解释为什么它有效。
归档时间: |
|
查看次数: |
156249 次 |
最近记录: |