我正在制作一个 javascript 应用程序,它使用 jquery 检索 .json
文件并将数据注入(inject)到它嵌入的网页中。
.json
文件使用 UTF-8 编码并包含重音字符,如 é、ö 和 å。
问题是我无法控制将要使用该应用程序的页面上的字符集。
一些将使用 UTF-8,但其他将使用 iso-8859-1 字符集。这当然会混淆 .json
文件中的特殊字符。
如何使用 javascript 将特殊的 UTF-8 字符转换为其等效的 is-8859-1?
最佳答案
实际上,所有内容通常都以某种类型的 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));
例如,编码错误的字符“å”会变成“Ã¥”。该命令执行 escape("Ã¥") == "%C3%A5"
,这是编码为单个字节的两个不正确的 ISO 字符。然后 decodeURIComponent("%C3%A5") == "å"
,其中两个百分比编码的字节被解释为 UTF8 序列。
如果您出于某种原因需要执行相反的操作,这也适用:
utfstring = unescape(encodeURIComponent(originalstring));
有没有办法区分错误的 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;
}
关于javascript - 如何使用 javascript 将特殊的 UTF-8 字符转换为其等效的 iso-8859-1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5396560/