UTF碼位
Unicode的目標(biāo)是為全世界每一種字符提供全球唯一的標(biāo)識(shí)符应又。(這里的唯一標(biāo)識(shí)符又稱為碼位(code point))送滞,是從0開始的數(shù)值。
表示字符的這些數(shù)值或碼位肚菠,我們稱之為編碼單元。對(duì)于UTF-16來(lái)說(shuō)碼位可以由多種編碼單元表示:
- 前2^16個(gè)碼位均以16位的編碼單元表示菱阵,這個(gè)范圍被稱為基本多文種平面(BMP, Basic Multilingual Plane)踢俄。
- 超出這個(gè)范圍就被稱作某個(gè)輔助平面(supplementary plane)。
也就是說(shuō)字符串里的字符有兩種晴及,一種是由一個(gè)編碼單元16位表示的BMP字符都办,另一種是由兩個(gè)編碼單元32位表示的輔助平面字符。
對(duì)于輔助平面字符:
- 其字符的長(zhǎng)度length屬性值位2
- 它被判定為兩個(gè)字符虑稼,故匹配單一字符串的正則表達(dá)式會(huì)失效
- 前后兩個(gè)16位編碼單元都不表示可打印字符琳钉,因此charAt()方法不會(huì)返回合法字符
- charCodeAt()方法同樣不會(huì)正確識(shí)別字符,它會(huì)返回每一個(gè)編碼單元對(duì)應(yīng)的數(shù)值
charPointAt()
這個(gè)方法接受編碼單元的位置而非字符位置為參數(shù)蛛倦,返回與字符串中給定位置對(duì)應(yīng)的碼位歌懒。
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()
該方法可以生成一個(gè)字符,相當(dāng)于完整版的String.fromCharCode()
String.fromCodePoint(134071) ; //"??"
normalize()
它可以提供Unicode的標(biāo)準(zhǔn)化形式溯壶。這個(gè)方法接受一個(gè)可選字符串參數(shù)及皂,指明應(yīng)用一下的某一種Unicode標(biāo)準(zhǔn)化形式:
- 以標(biāo)準(zhǔn)等價(jià)方式分解,然后以標(biāo)準(zhǔn)等價(jià)方式重組(“NFC”)且改,默認(rèn)選項(xiàng)
- 以標(biāo)準(zhǔn)等價(jià)方式分解(”NFD“)
- 以兼容等價(jià)方式分解(”NFKC“)
- 以兼容等價(jià)方式分解验烧,然后以標(biāo)準(zhǔn)等價(jià)方式重組(“NFKD”)
在對(duì)字符串比較之前,一定要先把它們標(biāo)準(zhǔn)化為同一形式
正則表達(dá)式u修飾符
當(dāng)一個(gè)正則表達(dá)式添加了u修飾符又跛,它就從編碼單元操作模式切換為字符模式碍拆。
console.clear();
const text = String.fromCodePoint(134071); //"??a"
console.log(/^.$/.test(text)); //false
console.log(/^.$/u.test(text)); //true
字符串的字串識(shí)別
- include()
- startsWith()
- endsWith()
三者都返回布爾值。三者都有第二參數(shù)慨蓝。include倔监,startsWith第二參數(shù)表示從那個(gè)位置開始搜索,endsWith表示從length-index位置開始搜索菌仁。如果傳入正則表達(dá)式則會(huì)引發(fā)錯(cuò)誤,而indexOf和lastIndexOf則不會(huì)静暂。
repeat()
其接受一個(gè)number類型的參數(shù)济丘,表示該字符串重復(fù)次數(shù),返回當(dāng)前字符串重復(fù)一定次數(shù)后的新字符串
console.clear();
const text = "Hello";
console.log(text.repeat(3)); //"HelloHelloHello"