字符串的 length 属性与字符数量不相等的问题
在 js 中,字符串的 length 属性,不一定等于字符串的长度。原因是因为 length 属性表示的是字符串中的码元的数量,而非字符个数。
码元
码元是编码字符集中的最小单位,用于构建和表示字符。在不同的编码方案中,码元的大小可能不同:
- 在 UTF-8 中,码元是 8 位(1 字节)
- 在 UTF-16 中,码元是 16 位(2 字节)
- 在 UTF-32 中,码元是 32 位(4 字节)
JavaScript 中的码元
在 js 中,使用的是 utf-16 编码来表示字符串,因此在 js 中:
- 每个码元是 16 位,也就是 2 字节
- 字符串的
length属性返回的是码元的数量,而不是字符的数量 - 字符串的索引操作也是基于码元的
- 每个字符可以被编码为 1 个或 2 个码元(看字符在 unicode 中的范围)