mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-25 19:22:21 +00:00
修改string/normalize
This commit is contained in:
parent
0dda99a04c
commit
d66f0faac0
@ -2,7 +2,7 @@
|
||||
|
||||
ES6加强了对Unicode的支持,并且扩展了字符串对象。
|
||||
|
||||
## codePointAt方法
|
||||
## codePointAt()
|
||||
|
||||
JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode编号大于0xFFFF的字符),JavaScript会认为它们是两个字符。
|
||||
|
||||
@ -72,13 +72,16 @@ JavaScript允许采用“\uxxxx”形式表示一个字符,其中“xxxx”表
|
||||
|
||||
上面代码表示,如果直接在“\u”后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript会理解成“\u20BB+7”。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。
|
||||
|
||||
ES6对这一点做出了改进,只要将超过0xFFFF的编号放入大括号,就能正确解读该字符。
|
||||
ES6对这一点做出了改进,只要将Unicode编号放入大括号,就能正确解读该字符。
|
||||
|
||||
```javascript
|
||||
|
||||
"\u{20BB7}"
|
||||
// "𠮷"
|
||||
|
||||
"\u{41}\u{42}\u{43}"
|
||||
// "ABC"
|
||||
|
||||
```
|
||||
|
||||
## 正则表达式的u修饰符
|
||||
@ -112,7 +115,7 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达
|
||||
|
||||
```
|
||||
|
||||
上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配属61个连续的u。
|
||||
上面代码表示,如果不加u修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配属61个连续的u。
|
||||
|
||||
**(3)量词**
|
||||
|
||||
@ -129,7 +132,7 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达
|
||||
|
||||
**(4)预定义模式**
|
||||
|
||||
u修饰符也影响到预定义模式,正确识别大于\uFFFF的Unicode字符。
|
||||
u修饰符也影响到预定义模式,能否正确识别大于\uFFFF的Unicode字符。
|
||||
|
||||
```javascript
|
||||
|
||||
@ -167,7 +170,54 @@ codePointLength(s) // 2
|
||||
|
||||
```
|
||||
|
||||
上面代码中,不加u修饰符,就无法识别非正规的K字符。
|
||||
上面代码中,不加u修饰符,就无法识别非规范的K字符。
|
||||
|
||||
## normalize()
|
||||
|
||||
为了表示语调和重音符号,Unicode提供了两种方法。一种是直接提供带重音符号的字符,比如Ǒ(\u01D1)。另一种是提供合成符号(combining character),即原字符与重音符号的合成,两个字符合成一个字符,比如O(\u004F)和ˇ(\u030C)合成Ǒ(\u004F\u030C)。
|
||||
|
||||
这两种表示方法,在视觉和语义上都等价,但是JavaScript不能识别。
|
||||
|
||||
```javascript
|
||||
|
||||
'\u01D1'==='\u004F\u030C' //false
|
||||
|
||||
'\u01D1'.length // 1
|
||||
'\u004F\u030C'.length // 2
|
||||
|
||||
```
|
||||
|
||||
上面代码表示,JavaScript将合成字符视为两个字符,导致两种表示方法不相等。
|
||||
|
||||
ES6提供String.prototype.normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为Unicode正规化。
|
||||
|
||||
```javascript
|
||||
|
||||
'\u01D1'.normalize() === '\u004F\u030C'.normalize()
|
||||
// true
|
||||
|
||||
```
|
||||
|
||||
normalize方法可以接受四个参数。
|
||||
|
||||
- NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。
|
||||
|
||||
- NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。
|
||||
|
||||
- NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。
|
||||
|
||||
- NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
|
||||
|
||||
```javascript
|
||||
|
||||
'\u004F\u030C'.normalize(NFC).length // 1
|
||||
'\u004F\u030C'.normalize(NFD).length // 2
|
||||
|
||||
```
|
||||
|
||||
上面代码表示,NFC参数返回字符的合成形式,NFD参数返回字符的分解形式。
|
||||
|
||||
不过,normalize方法目前不能识别三个或三个以上字符的合成。这种情况下,还是只能使用正则表达式,通过Unicode编号区间判断。
|
||||
|
||||
## contains(), startsWith(), endsWith()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user