Skip to content

在上一节,我们介绍了字符集

我们能够认识到每一个字符都会对应一个码值

这一节,我们来了解下编码方式

同一个码值在不同的编码方式下,它的字节长度和表示方式是不同的。

1.UCS-2

2.UTF-16

js
var str = '😂'
console.log(str.length) // 2

这其实是由于 JavaScript 的字符串长度是按照 utf-16 代码单元来读取的

这部分内容可见 ECMAScript 语言标准:ECMAScript® Language Specification

字符串类型是由 0 位或 16 位以上无符号整数值(元素)组成的所有有限有序序列的集合。

字符串类型通常用于表示运行中的ECMAScript 程序中的文本数据,在这种情况下,字符串中的每个元素都被视为码元值(参见第6条)。

这些位置用非负整数作索引。第一个元素(如果有)位于位置 0,下一个元素(如果有)位于位置 1,以此类推。字符串的长度是元素的数量(即,16位值)。空字符串的长度为零,因此不包含任何元素。

当字符串包含实际的文本数据时,每个元素都被认为是一个单独的 UTF-16 码元。

无论这是否是字符串的实际存储格式,字符串中的字符都是通过其初始码元元素位置进行编号的,就像使用 UTF-16 表示一样。所有字符串上的操作(除非另有说明)都将它们视为无差异 16 位无符号整数的序列,它们不能确保得到的字符串是标准格式的,也不能确保得到对语言敏感的结果。

3.UTF-32

4.UTF-8

UTF-8-维基百科

UTF-88-bit Unicode Transformation Format)是一种针对 Unicode可变长度字符编码,也是一种前缀码

它可以用一至四个字节Unicode 字符集中的所有有效编码点进行编码,属于 Unicode 标准的一部分。

UTF-8 就是为了解决向后兼容 ASCII 码而设计,Unicode 中前 128 个字符,使用与 ASCII 码相同的二进制值的单个字节进行编码,而且字面与ASCII 码的字面一一对应,这使得原来处理 ASCII 字符的软件无须或只须做少部分修改,即可继续使用。