学习正则前的预备 charCodeAt

news/2024/7/19 13:00:14 标签: 学习, javascript, html, js, unicode、

charCodeAt

方法返回给定索引表示 UTF-16 代码单元(code unit)的 065535 的整数值.

Unicode 与 UTF-16

字符串中字符的编码方式常见的有 Unicode, 其中 UTF-8, UTF-16UTF-32 都是 Unicode 这种编码方式的实现. 其中 UTF-8 使用 2 个字节(16个比特)编码, UTF-32 使用 4 个字节(32个比特)编码, 特殊的是 UTF-16, 它使用 2 个字节或者是 4 个字节编码.

😘😘强烈推荐阮一峰老师的关于 UnicodeUTF-16 的两篇博客 Unicode与JavaScript详解 和 字符编码笔记:ASCII,Unicode 和 UTF-8, 我会简单说为了方便 API 的背景我简单介绍一下, 介绍的内容在阮老师的博客中都有.

如果采用 Unicode 编码, 怎么区分一个字符究竟使用 2 个字节编码还是 4 个字节呢? 答案在于基本平面辅助平面.

如果是两个字节编码, 可以表示的编码范围在 U+0000U+FFFF. 其中的一部分 U+D800U+DBFF 范围就是基本平面, 在解析字符串的过程中每次读两个字节, 如果读到的两个字节恰好在基本平面内, 那么就会继读下面两个字节, 把四个字节放在一起解析. 如果读到的两个字节不在基础平面内, 那就直接解析这两个字节.

Code UnitCode Point

先介绍一下关于 code unitcode point 的关系. MDN 中介绍了一下. 由于采用了 UTF-16 这种编码方式, 在基本平面内, 也就是在 U+0000U+FFFF 中, code unitcode point 是等价的. 但是超过基本平面的范围, 即 U+10000U+10FFFF 的范围, code unit 就和 code point 不等价了.

我们将 U+10000U+10FFFF 范围内的称为 code point, 而一个 code point 需要两个 code unit 表示, 这两个 code unit 也被称为一个代理对(surrogate pair), 这时 code pointcode unit 就不再划等号了. 而此时代理对中每个 code unit 仍在 U+0000U+FFFF 中. 所以我们就明白了为什么 charCodeAt 返回的范围是 065535(2^16-1), 因为 charCodeAt 返回的是 code unit.

如果你问我为什么范围仅仅到 U+10FFFF 而不是到 U+FFFFFFFF, 那我也不知道, 反正 Unicode 就是这么规定的.

语法

charCodeAt 的参数是一个整数索引值, 要大于等于 0 并且小于字符串的长度. 如果索引不是 number 类型, 就将其默认为 0 看待.

从下图可以看到

  • 如果参数是 0 且小于字符串长度, 就正常返回
  • 如果参数是 number 但是超过了字符串长度或者是负数, 就返回 NaN
  • 如果输入的字符串(非 number 类型), 就返回索引为 0 处的结果
  • 如果输入的是小数
    • 正数, 向下取整
    • 负数, 在 -1 和 0 之间, 取 0; 否则返回 NaN

在这里插入图片描述

从上面的介绍中就可以看出来, 对于非基本平面内的字符, 使用 charCodeAt 没有办法获得其 Unicode 值, 比如这个 Emoji 字符😊
在这里插入图片描述

可以计算一下, 55357 对应的 16 进制为 U+D83D 是基本平面内的字符, 因此如果字符串内存在非基本平面内的字符, 需要小心使用 charCodeAt 这个方法. 当然不仅仅是 charCodeAt 可能返回有问题的结果, length 也有这个问题. 😅明明字符串中只有一个字符, 结果却返回了 2, 这是因为 length 计算 code unit 的数量来返回长度, 因为 😊 并非基础平面字符, 所以使用 2 个 code unit 编码一个字符, 因此就返回了 2.

在这里插入图片描述

这里说一些解决方法, 要是用 ES6Array.from 或者展开运算符将字符串转为数组再计算长度才可以准确处理非基础平面的字符

在这里插入图片描述
谢谢你看到这里😊


http://www.niftyadmin.cn/n/3655.html

相关文章

小师兄1995个人博客总目录

文章目录前言一、直流有刷电机系列文章二、直流无刷电机系列文章三、MBD系列文章四、硕士期间系列文章总结前言 该博客作用于记录自己的学习过程,不定时更新。博主毕业于控制科学与工程专业,硕士期间接触实验室电力电子、电机控制以及电网等相关项目&am…

从内核角度看网络包发送流程

一、前置知识 1、RingBuffer结构详解 关于RingBuffer网上有很多说法,有的人说RingBuffer是系统启动时就预先申请好的一个环形数组,有的人说RingBuffer是在接收或发送数据时才动态申请的一个环形数组,那么到底RingBuffer的结构是怎么样的呢&…

牛客前端刷题(十)—— 设计模式篇

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦! 赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享&a…

第十四届蓝桥杯(Web应用开发)模拟赛1期-大学组

数据类型检测 请看这篇数据类型检测 渐变色背景生成器 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&…

【C字符串函数】——对C语言中有关字符串库函数的实现及模拟

关于C语言的知识放在专栏&#xff1a;C 小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努力&#xff01; 推荐网站&#xff1a;cplusplus.com 目录字符串函数前言1.0 strl…

2.Tornado的优势

1.Tornado是一整套的异步编码方案 不仅仅是一整套Web框架&#xff0c;还包含了一整套http协议、websocket协议的库、还有异步库。我们就展开聊聊 2.Tornado不只是Web框架&#xff0c;还是Web服务器 Tornado可以开发Web应用&#xff0c;还可以通过Tornado部署其他的Web应用&a…

工作多年,技术认知不足,个人成长慢,职业发展迷茫,该怎么办?

随着技术的发展&#xff0c;整个行业对测试的要求越来越高。测试开发技术日新月异&#xff0c;随之而来的对测试开发工程师也有了更多的挑战&#xff0c;尤其是在这样的特殊时期&#xff0c;企业降本增效&#xff0c;招聘要求不断加码。 前几天和学员聊天&#xff0c;有同学反…

图的基本介绍

图的定义 1.基本概念 在图中&#xff0c;顶点之间的关系可以是任意的&#xff0c;任意两个元素之间都可能相关顶点的前驱和后继个数无限制 2.定义 图是一种&#xff1a;数据元素间存在多对多关系的数据结构加上一组基本操作构成的抽象数据类型可以表示为&#xff1a;G&…