为什么 "𠮷𠮷𠮷".length !== 3 ?
程序员的成长之路
共 6105字,需浏览 13分钟
·
2024-06-21 08:00
阅读本文大概需要 5 分钟。
来自:https://juejin.cn/post/7025400771982131236
以下是正文。
'吉'.length
// 1
'𠮷'.length
// 2
'❤'.length
// 1
'💩'.length
// 2
UTF-16
定与不定: UTF-16 最小的码元是两个字节,即使第一个字节可能都是 0 也要占位,这是固定的。不定是对于基本平面(BMP)的字符只需要两个字节,表示范围 U+0000 ~ U+FFFF,而对于补充平面则需要占用四个字节 U+010000~U+10FFFF。
UTF-16 的编码逻辑
如果码点小于等于 U+FFFF(也就是基本平面的所有字符),不需要处理,直接使用。
否则,将拆分为两个部分 ((cp – 65536) / 1024) + 0xD800,((cp – 65536) % 1024) + 0xDC00 来存储。
Unicode 标准规定 U+D800...U+DFFF 的值不对应于任何字符,所以可以用来做标记。
'\u0041'
// -> A
A === '\u0041'
// -> true
'\ud83d\udca9'
// -> '💩'
'💩' === '\ud83d\udca9'
// -> true
'\u0041' === '\u{41}'
// -> true
'\ud83d\udca9' === '\u{1f4a9}'
// -> true
可以打开 Dev Tool 的 console 面板,运行代码验证结果。
所以为什么 length 判断会有问题?
要解答这个问题,可以继续查看 规范,里面提到:在 ECMAScript 操作解释字符串值的地方,每个元素都被解释为单个 UTF-16 代码单元。
Where ECMAScript operations interpret String values, each element is interpreted as a single UTF-16 code unit.
const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
if (str) {
val = value.replace(spRegexp, '_').length;
}
ES6 对 Unicode 的支持
for vs for of
var str = '👻yo𠮷'
for (var i = 0; i < str.length; i ++) {
console.log(str[i])
}
// -> �
// -> �
// -> y
// -> o
// -> �
// -> �
var str = '👻yo𠮷'
for (const char of str) {
console.log(char)
}
// -> 👻
// -> y
// -> o
// -> 𠮷
展开语法(Spread syntax)
[...'💩'].length
// -> 1
正则表达式 u
/^.$/.test('👻')
// -> false
/^.$/u.test('👻')
// -> true
charCodeAt/codePointAt
对于字符串,我们还常用 charCodeAt 来获取 Code Point,对于 BMP 平面的字符是可以适用的,但是如果字符是辅助平面字符 charCodeAt 返回结果就只会是编码后第一个码元对于的数字。
'羽'.charCodeAt(0)
// -> 32701
'羽'.codePointAt(0)
// -> 32701
'😸'.charCodeAt(0)
// -> 55357
'😸'.codePointAt(0)
// -> 128568
String.prototype.normalize()
'café' === 'café'
// -> false
'cafe\u0301'
// -> 'café'
'cafe\u0301'.length
// -> 5
'café'.length
// -> 4
'cafe\u0301'.normalize() === 'café'.normalize()
// -> true
'cafe\u0301'.normalize().length
// -> 4
总结
推荐阅读:
Spring Cloud + Nacos + 负载均衡器实现全链路灰度发布实战
《云服务器限时免费领取》 轻量级服务器-2核4G5M 1个月 云服务器-2核4G3M 1个月 ⬇戳阅读原文领取 朕已阅
评论
一个全面的开源"稍后阅读"解决方案
大家好,又见面了,我是 GitHub 精选君!背景介绍在当今信息爆炸的时代,我们每天都会看到海量的文章、新闻和报告,这其中有很多值得细细品读和回顾的优质内容。然而,我们往往因为时间或环境的限制,不能马上阅读这些内容,这时候一个优质的 "稍后阅读" 工具就显得尤为重要。市面上虽然存在一些这样的工具,但
开源你我他
0