码元和码点的区别

news/2024/11/19 14:12:26/文章来源:https://www.cnblogs.com/zhenfeng25/p/18554718

charCodeAt与codePointAt的用法:

相同点

  • charCodeAt与codePointAt都是字符串实例上的方法,用途都是用来返回指定索引位字符的Unicode编码。

不同点

  • charCodeAt与codePointAt匹配索引位的规则不一样。charCodeAt是根据码元来匹配,codePointAt是根据码点来进行匹配的。

先举个例子:


 

 


可以发现一个非常神奇的事情。

有些中文字符 𠮷 、 𪚥 的长度不为1,并且charCodeAtcodePointAt对相同字进行处理返回的结果却是不同的。

这其中的原因就是charCodeAt是以一个码元为一个索引,codePointAt是以一个码点为一个索引进行处理的

Unicode使用16位二进制来存储文字。我们将一个16位的二进制编码叫做一个码元(Code Unit),Unicode编码范围在0 - 2^16。也就是我们所说的占2个字节。

由于技术的发展,Unicode对文字编码进行了扩展,将某些文字扩展到了32位(占用两个码元),并且,将某个文字对应的二进制数字叫做码点(Code Point),Unicode编码范围在0 - 2^32,占4个字节。

特别要注意,码点可以是一个码元,也可以是两个码元。

字符串的length属性返回的是码元。所以在对一些字符串如果要处理长度的时候要注意这一点。

𠮷 这个字的Unicode编码是 \ud842\udfb7,占用了两个码元。

所以当用charCodeAt(0)是匹配0位的码元,也就是返回给我们55362

当用codePointAt(0)是匹配0位的码元,codePointAt能识别出字符串的码点,所以反回134071,反之将直接返回在那个索引处的编码单元

𠮷.codePointAt(1)为什么返回的是57271呢?

这是因为索引位是根据码元,而匹配的规则是根据码点的规则。如果后面两位码元是一个码点,就会当作一个码点来处理。

总结

charCodeAt是以码元为单位来处理的,也就是说按照每16位2进制数为单位。一个16位2进制数就是一位,所以处理不了Unicode扩展编码字符(32位2进制)。他会把32位2进制数当成两个16位2进制数处理

codePointAt也是以码元位单位来处理的。与charCodeAt不同的地方是,当处理到当前位码元时,如果超过了16位2进制数值的上线,他就明白这是一个32位2进制数,就会以32位2进制数当作一个来处理。

可以通过codePointAt来判断当前字符是是32位的(俩个码元)还是16位的(单个码元)

function is32bit(char, i) {//如果码点大于了16位二进制的最大值,则其是32位的return char.codePointAt(i) > 0xffff;
}

同样的,也可以通过这个方法来判断以字符串真实的长度(码点的长度)

function getLengthOfCodePoint(str) {var len = 0;for (let i = 0; i < str.length; i++) {//i在索引码元if (is32bit(str, i)) {//当前字符串,在i这个位置,占用了两个码元i++;}len++;}return len;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836799.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMDB平台(进阶篇):CMDB的构建指南(二)

CMDB(配置管理数据库)作为IT服务管理中的重要组成部分,其构建过程需要严谨且细致的规划。在CMDB的构建过程中,定义需求和创建IT服务模型蓝图是两个至关重要的阶段。本文将详细探讨这两个阶段,为CMDB的构建提供实用指南。 定义需求 定义需求是CMDB构建的首要步骤,其核心在…

Transformer Concept Exploration and Practice in Pytorch

This post explores the principles about the impressive transformer structure and for downstream tasks, such as machine translate, it achieves the full implementation and training details.Introduction Transformer 是一种广泛应用与自然语言处理的神经网络架构,…

PN-RT中的一些基础概念

以太网帧和时间直接的关系我们通常的描述的1Gbps/100Mbps/1000Mbps是什么意思:bps就是bit per second的意思,表示每秒支持多少个bit的传输速率。1Gbps就是某一个网卡最大支持用1G bit每秒的速率发送/接收bit流。1Gbps = 1 x 10^9 bit per second 1Mbps = 1 x 10^6 bit per se…

校园防欺凌预警系统 学生打架智能识别系统

校园防欺凌预警系统 学生打架智能识别系统在校园的卫生间、宿舍等容易发生欺凌行为的场所,安装AI语音防欺凌报警系统是十分必要的。校园防欺凌预警系统 学生打架智能识别系统能够实时监听周围的声音,一旦检测到异常求救关键词,系统会立即启动报警程序。系统会立刻将警情传送…

NSSM封装Windows服务工具的使用与介绍

NSSM 是一个服务封装程序,它可以将普通 exe 程序 或 Java程序 或 Nodejs 项目封装成服务,像 windows 服务一样运行。同类型的工具还有微软自己的 srvany,不过 NSSM 更加简单易用,并且功能强大。它的特点如下: 支持普通 exe 程序(控制台程序或者带界面的 Windows 程序都可…

AI 实战篇:Spring-AI再更新!细细讲下Advisors

在2024年10月8日,Spring AI再次进行了更新,尽管当前版本仍为非稳定版本(1.0.0-M3),但博主将持续关注这些动态,并从流行的智能体视角深入解析其技术底层。目前,Spring AI仍处于小众状态,尚未经过开源社区多年的维护和稳定化过程,这与已经较为成熟的Spring框架形成鲜明对…

充电桩车位长时间占用识别系统

充电桩车位长时间占用识别系统利用充电站现场装好的监控摄像头, 充电桩车位长时间占用识别系统24小时对监控区域内的车位进行实时监测。当检测到燃油车占用充电桩车位,并且停车时长超过指定时间时将产生报警,并自动识别车牌号。一旦系统产生报警,它将识别车牌号,并将报警信…

接口控制器层(Controller层)设计(网文)

在实际工作中,我们需要经常跟第三方平台打交道,可能会对接第三方平台Controller接口,或者提供Controller接口给第三方平台调用。 那么问题来了,如果设计一个优雅的Controller接口,能够满足:安全性、可重复调用、稳定性、好定位问题等多方面需求? 今天跟大家一起聊聊设计…

橙啦视频课件课程下载工具,如何在电脑端下载橙啦视频课程课件资料PDF,PPT到本地?

一. 安装橙啦课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/orangevip_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无止下…

.NET +Vue 开发的高级报表工具

前言 本文介绍一款基于 .NET 6 开发的高级报表工具。该工具支持多种数据源(如数据库、Excel 文件、API 服务等),并具备强大的数据处理和可视化功能。通过内置的集合函数和类 Excel 界面,用户可以轻松设计和生成复杂的报表,满足各类业务需求。 项目介绍 CellReport 是一款专…

Docker安装配置Seata-Server

1 部署 官方文档指引1.1 client 每个业务数据库都要新建 undo_log 表。 对 springboot 应用,执行 client - MySQL - AT,切tag=1.5.2: https://github.com/seata/seata/blob/v1.5.2/script/client/at/db/mysql.sql1.2 server 新建 seata-for-hire 数据库,执行 server - MySQ…

HHDB数据库介绍

背景 随着互联网的崛起,海量数据的存储、计算、分析需求越来越普遍。在各种计算机应用场景中,传统集中式数据库面临着理论升级和技术升级两大难题。21世纪以来,随着以 Hadoop及其衍生技术为代表的大规模数据处理技术的崛起,数据库技术开始由集中式走向分布式计算与存储的模…