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

标签 javascript jquery character-encoding

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

.json 文件使用 UTF-8 编码并包含重音字符,如 é、ö 和 å。

问题是我无法控制将要使用该应用程序的页面上的字符集。

一些将使用 UTF-8,但其他将使用 iso-8859-1 字符集。这当然会混淆 .json 文件中的特殊字符。

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

最佳答案

实际上,所有内容通常都以某种类型的 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));

例如,编码错误的字符“å”会变成“Ã¥”。该命令执行 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/

相关文章:

javascript - Angular 2组件@Input不工作

javascript - 可见绑定(bind)在 Knockout js 中不起作用

javascript - react 相当于 getElementsByTagName

javascript - 如何将类添加到 jQuery 中选定的范围?

javascript - 如何处理 json XMLHttpRequest 中的外来字符

javascript - Firefox 4 和 ASyncFileUpload

javascript - 如何在运行时创建 SignalR 组

jquery - 我无法在 Bootstrap 4 导航栏周围放置容器

Java (Android) 字符串中的 UTF-8 字符

python - 在 Python 中将 Unicode 转换为 ASCII 而不会出错