JavaScript < ES5、ES6、ES7、… >ECMAScript 6

ES6关于Unicode的相关扩展(4)

2018-11-21  本文已影响22人  CodeMT

前面的话


JS中的字符串类型是由引号括起来的一组由16位Unicode字符组成的字符序列。在过去,16位足以包含任何字符,直到Unicode引入了扩展字符集,编码规则不得不进行变更。本文将详细介绍ES6关于Unicode的相关扩展

概述

【BMP】

大括号表示

// "a"console.log("\u0061");

// "𠮷"console.log("\uD842\uDFB7");// "₻7"console.log("\u20BB7");

// "𠮷"console.log("\u{20BB7}");// "ABC"console.log("\u{41}\u{42}\u{43}");
let hello = 123;// 123console.log(hell\u{6F});
// trueconsole.log('\u{1F680}' === '\uD83D\uDE80');

'\z' === 'z'// true'\172' === 'z'// true'\x7A' === 'z'// true'\u007A' === 'z'// true'\u{7A}' === 'z'// true

字符编解码

【codePointAt()】

var text = "𠮷a";
console.log(text.charCodeAt(0));// 55362console.log(text.charCodeAt(1));// 57271console.log(text.charCodeAt(2));// 97console.log(text.codePointAt(0));// 134071console.log(text.codePointAt(1));// 57271console.log(text.codePointAt(2));// 97

function is32Bit(c) { returnc.codePointAt(0) > 0xFFFF;
}
console.log(is32Bit("𠮷" ));// true console.log(is32Bit("a"));// false

【String.fromCodePoint()】

console.log(String.fromCharCode(0x20bb7));//"ஷ"
console.log(String.fromCodePoint(0x20bb7)); // "𠮷"
console.log(String.fromCharCode(0x0bb7));// "ஷ"

// trueString.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'

for...of

var s = '𠮷a';for(let chins) {
console.log(s[ch]);
}//�//�//a

var s = '𠮷a';for(let ch of s) {
console.log(ch);
}//𠮷//a

normalize()

console.log('\u01D1'==='\u004F\u030C');//falseconsole.log('\u01D1'.length);
// 1console.log('\u004F\u030C'.length);// 2

console.log('\u01D1'==='\u01D1'.normalize());
//trueconsole.log('\u01D1'=== '\u004F\u030C'.normalize());//true

1. NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价

console.log('\u01D1'==='\u01D1'.normalize("NFC"));//trueconsole.log('\u01D1'=== '\u004F\u030C'.normalize("NFC"));//true

2. NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符

console.log('\u004F\u030C'==='\u01D1'.normalize("NFD"));//trueconsole.log('\u004F\u030C'=== '\u004F\u030C'.normalize("NFD"));//true

3. NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize方法不能识别中文。)

4. NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符

U修饰符

/^\uD83D/u.test('\uD83D\uDC2A')// false/^\uD83D/.test('\uD83D\uDC2A')// true

【点号】

var text = "𠮷";
console.log(text.length); // 2console.log(/^.$/.test(text));
//falseconsole.log(/^.$/u.test(text));//true

【大括号】

/\u{61}/.test('a')// false/\u{61}/u.test('a')// true/\u{20BB7}/u.test('𠮷')// true

【量词】

/a{2}/.test('aa')// true/a{2}/u.test('aa')// true/𠮷{2}/.test('𠮷𠮷')// false/𠮷{2}/u.test('𠮷𠮷')// true

【预定义模式】

/^\S$/.test('𠮷') // false/^\S$/u.test('𠮷')// true

【字符串长度】

function codePointLength(text) { varresult = text.match(/[\s\S]/gu); returnresult ? result.length : 0;
}var s = '𠮷𠮷';
console.log(s.length); // 4console.log(codePointLength(s));// 2

【检测支持】

function hasRegExpU() { try { varpattern =newRegExp(".", "u"); returntrue;
} catch (ex) { returnfalse;
}
}

上一篇下一篇

猜你喜欢

热点阅读