From d66f0faac0937b0db24d1a4224fe8d03cbd043d6 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 23 Nov 2014 08:29:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/normalize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 60 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/docs/string.md b/docs/string.md index 0f8f369..288fecc 100644 --- a/docs/string.md +++ b/docs/string.md @@ -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()