如果<meta charset="utf-8">意味着JavaScript使用的是utf-8编码而不是utf-16。

3

我一直在努力理解为什么JavaScript中到处都需要进行UTF-8编码/解码,后来我了解到JavaScript使用UTF-16编码。

让我们谈谈Javascript字符串编码

所以我想这也是utf8.js等库存在的原因,用于在UTF-16和UTF-8之间转换。

但最后他提供了一些见解:

在Node中进行编码非常令人困惑,并且难以正确处理。当你意识到Javascript字符串类型将始终被编码为UTF-16时,以及大多数其他地方RAM中的字符串与套接字,文件或字节数组交互时,该字符串将被重新编码为UTF-8,这是有帮助的。

当然,所有这些都非常低效。大多数字符串可以表示为UTF-8,并且使用两个字节表示它们的字符意味着您正在使用比所需更多的内存,以及支付重新编码字符串的O(n)税,每次遇到HTTP或文件系统边界时。

那让我想起了HTML <head> 中的 <meta charset=“utf-8”>, 除了“你需要这个才能使文本正常工作”之外,我从未对此过多思考。现在我在想,这个问题是关于什么的,如果那个<meta charset=“utf-8”> 标签告诉 JavaScript 进行 UTF-8 编码,那么当你在 JavaScript 中创建字符串时,它们将是 UTF-8 编码而不是 UTF-16。或者如果我理解错误,它到底是在做什么。如果它告诉 JavaScript 使用 UTF-8 编码而不是 UTF-16(我猜这被认为是“默认值”),那么这意味着你不需要支付执行 UTF-8 和 UTF-16 之间转换的 O(n) 税,这将带来性能提升。想知道我是否理解正确,或者如果不是,那我错在哪里。

1
我一直认为meta charset是告诉浏览器HTML文档的编码方式。 - Taplar
@Taplar 这正是它所做的。 - Remy Lebeau
3个回答

6

首先,需要了解在大多数过去和现在的网络浏览器中...

JavaScript 引擎使用 UTF-16

浏览器 HTML5 解析器使用 UTF-8


其次,下面的这个meta标签不是必需的,但建议使用...

<meta charset=“utf-8” />

设置这个meta标签会影响您的HTML / HTML5网页编码,但大多数现代浏览器都知道HTML / HTML5是从UTF-8编码和解码的,所以这是可选的。顺便说一下,现在大部分Web都是HTML5,并且UTF-8是默认编码。

在HTML 3或4系列浏览器中,“旧”的编码/解码系统对于大多数讲英语的人来说使用ASCII的各种变体,其存储方式与UTF-8相同。因此,大多数过去和现在的Web浏览器都是跨兼容的,无需任何元标记设置或额外的编码/解码例程。

然而,这个meta标签设置与JavaScript编码无关,也不会改变或影响JavaScript,只是告诉它使用UTF-8编码解码您的页面,默认情况下,在所有新版本的浏览器中都是这样做的。但是,这个meta标签将告诉Web浏览器的JavaScript引擎应该如何编码这个网页,并如何将其解码为JavaScript在解析和操作Web页面的DOM时存储字符编码的UTF-16。

有一个被弃用的meta标签是可选的,允许您控制外部或内部


1

元数据中的字符集

<meta charset=“utf-8”> 标签告诉 HTML(更准确地说,是 HTML 解析器)页面的编码是 utf8。

JS 没有内置的功能来切换不同的字符串编码 - 它始终是 utf-16。

渐近界限

我认为转换编码没有 O(n) 的惩罚。每当需要进行这种编码更改时,已经存在一个 O(n) 操作:读取/写入数据流。因此,每个八位组上的固定数量的操作仍将是 O(n)。编码更改仅需要本地知识,即仅具有固定长度的前瞻窗口,并且可以通过在流读取/写入代码中加入进行,其惩罚为 O(1)

您可以认为空间惩罚是 O(n),但是如果需要将字符串存储在任何标准编码中(即不使用压缩),则移动到 utf-16 最多意味着乘以 2,因此仍然保持在 O(n) 界限内。

常数因子

即使关注的是最小化隐藏在O(n)符号中的常数因子,编码更改在时间域上至少只有一点点影响。将utf-16流写入/读取为utf-8对于大多数(西方)文本数据来说意味着跳过每个第二个八位组/插入空八位组。与与套接字或文件系统进行交互产生的开销和延迟相比,这种性能损失微不足道。

当然,存储是不同的,尽管今天存储相对便宜,上限仍为2。从32位到64位的转换在数字表示和指针方面具有更高的内存影响。


0

关于“meta charset=“utf-8””...这再次表明了构建网络的标准机构可以有多么草率。这与字符集没有任何关系,而是与字形编码有关。字符集更接近于字母表或语言,而不是编码。HTML犯了尽可能大的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接