UTF码位
Unicode的目标是为全世界每一种字符提供全球唯一的标识符。(这里的唯一标识符又称为码位(code point)),是从0开始的数值。
表示字符的这些数值或码位,我们称之为编码单元。对于UTF-16来说码位可以由多种编码单元表示:
- 前2^16个码位均以16位的编码单元表示,这个范围被称为基本多文种平面(BMP, Basic Multilingual Plane)。
- 超出这个范围就被称作某个辅助平面(supplementary plane)。
也就是说字符串里的字符有两种,一种是由一个编码单元16位表示的BMP字符,另一种是由两个编码单元32位表示的辅助平面字符。
对于辅助平面字符:
- 其字符的长度length属性值位2
- 它被判定为两个字符,故匹配单一字符串的正则表达式会失效
- 前后两个16位编码单元都不表示可打印字符,因此charAt()方法不会返回合法字符
- charCodeAt()方法同样不会正确识别字符,它会返回每一个编码单元对应的数值
charPointAt()
这个方法接受编码单元的位置而非字符位置为参数,返回与字符串中给定位置对应的码位。
console.clear();
const text = String.fromCodePoint(134071) + "a"; //"𠮷a"
console.log(text.charCodeAt(0)); //55362
console.log(text.charCodeAt(1)); //57271
console.log(text.charCodeAt(2)); //97
console.log(text.codePointAt(0)); //134071
console.log(text.codePointAt(1)); //57271
console.log(text.codePointAt(2)); //97
console.log(text.length); //3
String.fromCodePoint()
该方法可以生成一个字符,相当于完整版的String.fromCharCode()
String.fromCodePoint(134071) ; //"𠮷"
normalize()
它可以提供Unicode的标准化形式。这个方法接受一个可选字符串参数,指明应用一下的某一种Unicode标准化形式:
- 以标准等价方式分解,然后以标准等价方式重组(“NFC”),默认选项
- 以标准等价方式分解(”NFD“)
- 以兼容等价方式分解(”NFKC“)
- 以兼容等价方式分解,然后以标准等价方式重组(“NFKD”)
在对字符串比较之前,一定要先把它们标准化为同一形式
正则表达式u修饰符
当一个正则表达式添加了u修饰符,它就从编码单元操作模式切换为字符模式。
console.clear();
const text = String.fromCodePoint(134071); //"𠮷a"
console.log(/^.$/.test(text)); //false
console.log(/^.$/u.test(text)); //true
字符串的字串识别
- include()
- startsWith()
- endsWith()
三者都返回布尔值。三者都有第二参数。include,startsWith第二参数表示从那个位置开始搜索,endsWith表示从length-index位置开始搜索。如果传入正则表达式则会引发错误,而indexOf和lastIndexOf则不会。
repeat()
其接受一个number类型的参数,表示该字符串重复次数,返回当前字符串重复一定次数后的新字符串
console.clear();
const text = "Hello";
console.log(text.repeat(3)); //"HelloHelloHello"