UTF碼位
Unicode的目標是為全世界每一種字符提供全球唯一的標識符。(這里的唯一標識符又稱為碼位(code point)),是從0開始的數(shù)值。
表示字符的這些數(shù)值或碼位,我們稱之為編碼單元。對于UTF-16來說碼位可以由多種編碼單元表示:
- 前2^16個碼位均以16位的編碼單元表示,這個范圍被稱為基本多文種平面(BMP, Basic Multilingual Plane)。
- 超出這個范圍就被稱作某個輔助平面(supplementary plane)。
也就是說字符串里的字符有兩種,一種是由一個編碼單元16位表示的BMP字符,另一種是由兩個編碼單元32位表示的輔助平面字符。
對于輔助平面字符:
- 其字符的長度length屬性值位2
- 它被判定為兩個字符,故匹配單一字符串的正則表達式會失效
- 前后兩個16位編碼單元都不表示可打印字符,因此charAt()方法不會返回合法字符
- charCodeAt()方法同樣不會正確識別字符,它會返回每一個編碼單元對應的數(shù)值
charPointAt()
這個方法接受編碼單元的位置而非字符位置為參數(shù),返回與字符串中給定位置對應的碼位。
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的標準化形式。這個方法接受一個可選字符串參數(shù),指明應用一下的某一種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()
三者都返回布爾值。三者都有第二參數(shù)。include,startsWith第二參數(shù)表示從那個位置開始搜索,endsWith表示從length-index位置開始搜索。如果傳入正則表達式則會引發(fā)錯誤,而indexOf和lastIndexOf則不會。
repeat()
其接受一個number類型的參數(shù),表示該字符串重復次數(shù),返回當前字符串重復一定次數(shù)后的新字符串
console.clear();
const text = "Hello";
console.log(text.repeat(3)); //"HelloHelloHello"