修改string/normalize

This commit is contained in:
ruanyf
2014-11-23 08:29:46 +08:00
parent 0dda99a04c
commit d66f0faac0
+55 -5
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的数值(比如\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()