1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-25 19:22:21 +00:00

修改string/normalize

This commit is contained in:
ruanyf 2014-11-23 08:29:46 +08:00
parent 0dda99a04c
commit d66f0faac0

View File

@ -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的数值比如\u20BB7JavaScript会理解成“\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()