在上一节,我们介绍了字符集。
我们能够认识到每一个字符都会对应一个码值。
这一节,我们来了解下编码方式。
同一个码值在不同的编码方式下,它的字节长度和表示方式是不同的。
1.UCS-2
2.UTF-16
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
(8-bit Unicode Transformation Format
)是一种针对 Unicode
的可变长度字符编码,也是一种前缀码。
它可以用一至四个字节对 Unicode
字符集中的所有有效编码点进行编码,属于 Unicode
标准的一部分。
UTF-8
就是为了解决向后兼容 ASCII
码而设计,Unicode
中前 128
个字符,使用与 ASCII
码相同的二进制值的单个字节进行编码,而且字面与ASCII
码的字面一一对应,这使得原来处理 ASCII
字符的软件无须或只须做少部分修改,即可继续使用。