/*
es6 加强了对 Unicode 的支持,并且扩展了字符串对象.
*/
// Javascript允许采用 \uxxxx 形式表示一个字符,其中 xxxx 表示字符的 Unicode 码点.
console.log('\u0061') //a
// 但是,这种表示法只限于码点在 \u0000 ~ \uFFFF 之间的字符.超出这个范围的字符,必须用 2 双汉字的形式表达
console.log('\uD842\uDFB7') //𠮷
// ???
// console.log('\u20BB7') //7
/*
codePointAt()
在Javascript内部,字符以 UTF-16 的格式储存,每个字符固定为 2 个字节.
对于那些需要 4 个字节储存字符(Unicode码点大于0xFFFF的字符), Javascript会认为他们是 2 个字符.
*/
var s = '𠮷'
console.log(s.length) //2
console.log(s.charAt(0)) //?
console.log(s.charAt(1)) //?
console.log(s.charCodeAt(0)) //55362
console.log(s.charCodeAt(1)) //57271
// "𠮷" 的码点是 0x20BB7 ,
// UTF-16 编码为 0xD842 0xDFB7 ,需要 4 个字节储存.对于这种4个字节的字符,Javascript不能正确处理,字符串长度会被误判为 2, 而且 charAt 方法无法读取整个字符,charCodeAt 方法只能分别返回前 2 个字节和后 2 个字节的值.
// es6 提供了 codePointAt 方法,能够正确处理 4 个字节储存的字符,返回一个字符的码点.
var s = '𠮷a'
console.log(s.codePointAt(0)) //134071 第一个字符(𠮷的后两个字节) 返回十进制码点134071
console.log(s.codePointAt(1)) //57271 第二个字符(𠮷的后两个字节)
console.log(s.codePointAt(2)) //97 第三个字符(a)
// codePointAt 方法是测试一个字符是由 2 个字节还是 4 个字节组成的最简单方法.
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF
}
console.log(is32Bit('𠮷')) //true 是4个字节
console.log(is32Bit('a')) //false 是2个字节
/*
String.fromCodePoint()
es5 提供了 String.fromCharCode 方法,用于从码点返回对应字符,但是这个方法不能识别32位的 UTF-16 字符(Unicode 编号大于 0xFFFF)
*/
console.log(String.fromCharCode(0x20BB7)) //ஷ
// 上述代码中, String.fromCharCode 不能识别大于 0xFFFF 的码点
// es6 提供了String.fromCodePoint 方法, 可以识别大于 0xFFFF 的字符, 弥补了 String.fromCharCode 的不足.
console.log(String.fromCodePoint(0x20BB7)) //𠮷
4.1、字符的Unicode表示法
最新推荐文章于 2023-03-19 15:19:30 发布