字符串

字符的Unicode表示法

JavaScript允许采用\uxxxx表示一个字符,其中xxxx表示字符的码点。

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

但是这种表示法只限于\u0000 -- \uFFFF之间的字符。超出这个范围的字符,必须用双字节表示法表达

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

上面代码表示,如果在\u后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript就会理解成\u20BB+7,由于\u20BB是一个不可打印字符,所以会显示一个空格,后面跟一个7(₻7)

ES6对这点做了改进,只要将码点放入大括号,就能正确解读该字符

console.log("\u{20BB7}");//𠮷

JavaScript 方法表示一个字符

  1. ‘\z’ === ‘z’ //true
  2. ‘\172’ === ‘z’ //true
  3. ‘\x7A’ === ‘z’ //true
  4. ‘\u007A’ === ‘z’ //true
  5. ‘\u{7A}’ === ‘z’ //true

codePointAt()

JavaScript内部,字符以UTF-16的格式存储,每个字符固定为2字节,对于那些需要4个字节存储的字符(码点大于0xFFFF的字符),JavaScript会认为他们是两个字节。

“𠮷”字码点是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节存储。对于4个字节的字符,JavaScript不能正确处理,字符串长度就会误判长度为2,而且charAt方法无法读取整个字符,charCodeAt方法只能返回前2个字节和后2个字节的值。

ES6提供的codePointAt()方法,能够正确处理4个字节存储的字符,返回一个字符的码点。

var str = "𠮷a"
console.log(str.charCodeAt(0));
console.log(str.charCodeAt(1));

console.log(str.codePointAt(0));
console.log(str.codePointAt(1));
console.log(str.codePointAt(2));

//55362
//57271
//134071
//57271
//97

codePointAt()检测一个字符占用的编码单元数量

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

String.fromCodePoint()

String.fromCodePoint()方法根据指定的码位生成一个字符。

console.log(String.fromCodePoint(134071));//𠮷

normalize()

ES6为字符串实例化提供了normalize方法,用来将两个字符的不同表示方法统一为同样的形式,称为Unicode正规化。

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

normalize接受4个参数

  • NFC 标准等价合成
  • NFD 标准等价分解
  • NFKC 兼容等价合成
  • NFKD 兼容等价分解

在对比字符串之前,一定要把它们标准化为同一形式


  Reprint please specify: 云深不知处 字符串

 Previous
正则表达式 正则表达式
正则表达式u修饰符正则表达式可以完成简单的字符串操作,但默认将字符串的每个字符按照16位编码单元处理。为解决这个问题,ES6给正则表达式定义一个支持Unicode的u修饰符 u修饰符实例let text = '𠮷'
2019-03-11
Next 
全局块作用域 全局块作用域
var 被用于全局作用域时,他会创建一个新的全局变量作为全局对象(浏览器环境中的window对象)的属性。这意味着var可能会无意中覆盖一个已经存在的全局属性。 var RegExp = "hello"; console.log(windo
2019-03-11
  TOC