JavaScript UTF-16字符串介绍

164 阅读2分钟

在JavaScript里,字符串是以UTF - 16编码形式存储的。下面详细介绍JavaScript UTF - 16字符串的相关内容。

1. UTF-16编码概述

UTF-16(16 - bit Unicode Transformation Format)是一种用于编码Unicode字符的字符编码方式。它使用16位(即2个字节)来表示大部分常用字符,而对于超出基本多文种平面(BMP)的字符,则使用两个16位编码单元(即4个字节)来表示,这两个编码单元被称为代理对

2. 基本多文种平面(BMP)字符

基本多文种平面涵盖了从U+0000到U+FFFF的字符,这些字符可以用一个16位编码单元来表示。在JavaScript中,大部分常用字符都处于这个范围内,比如英文字母、数字、常见标点符号以及许多其他语言的基本字符。

以下是一个简单示例:

let bmpString = 'Hello, 世界!';
console.log(bmpString.length); // 输出9,因为每个字符由一个16位编码单元表示

3. 代理对(Surrogate Pairs)

超出基本多文种平面(即U+10000到U+10FFFF)的字符,需要使用代理对来表示。代理对由一个高代理项(范围是U+D800到U+DBFF)和一个低代理项(范围是U+DC00到U+DFFF)组成。

在JavaScript里,由于字符串采用UTF - 16编码,当遇到代理对时,字符串的length属性会将代理对中的每个编码单元都当作一个字符来计数,这就可能导致length属性的值和实际字符数量不一致。

let emoji = '😀'; // 这是一个超出BMP的表情符号
console.log(emoji.length); // 输出2,因为它由一个代理对表示

4. 处理UTF-16字符串的方法

codePointAt方法

codePointAt方法可以返回指定位置的码点。如果指定位置是代理对的高代理项,它会返回整个代理对所代表字符的码点;如果是普通字符,则返回该字符的码点。

let str = '😀';
let codePoint = str.codePointAt(0);
console.log(codePoint.toString(16)); // 输出1f600

fromCodePoint方法

fromCodePoint方法能够根据给定的码点创建一个字符串。

let str = String.fromCodePoint(0x1F600);
console.log(str); // 输出😀

for...of循环

使用for...of循环遍历字符串时,它会正确处理代理对,将代理对当作一个字符来处理。

let str = '😀Hello';
for (let char of str) {
    console.log(char);
}

综上所述,在处理JavaScript中的UTF-16字符串时,要特别留意代理对的情况,以免在计算字符数量、截取字符串等操作中出现错误。