表情、特殊字符、字符串截取

news2024/11/20 0:49:30

码元与码点

关于码元和和码点,通过一个例子进行介绍。

如图,字符串'😊'只有一个“笑脸”符号,但是通过length属性发现,“长度”为2,string.length到底表示什么?

答:码元的个数

什么是码元?码元就是编码的最小单元,UTF-16和UCS-2的码元为16个比特(2字节)。也就是说,'😊'使用了两个码元,也就是4字节进行编码。

通过string.charCodeAt(index)方法可以返回对应位置的码元。

那什么是码点呢?码点就是对应字符的编码,通过对应编码规则,将编码转换为1个或多个码元。

通过string.codePointAt(index)方法可以返回对应位置的码点。

 

这里再说回到Unicode和UCS-2、UTF-16等之间的关系。

Unicode编码,是统一的,对于一个确定的字符,他的Unicode编码就是确定的。就拿上面的例子来说,'😊'的Unicode编码为128522。那UTF-8、UTF-16等等这些编码是什么?这里更加容易理解的说法就是,他们都是Unicode编码的一种格式,也就是不同的“转换规则”。

这里使用了一个在线的编码工具https://www.qqxiuzi.cn/bianma/Unicode-UTF.php

可以看到,同样的Unicode编码,在UTF-8和UTF-16两种编码方式下,变成了完全不同的“格式”。但是,通过对应的编码规则“逆向”的推导,最终推导出Unicode的编码是一致的。

下面来看一下UTF-16怎么对'😊'进行编码:

由于输出时,默认使用10进制输出数字,为了看清楚码元和码点的关系,可以使用16进制输出。

 

可以看到,从码点编码为多个码元并不是简单的“组装”。UTF-16编码规则如下:

参考https://www.cnblogs.com/malecrab/p/5300503.html

如果码点(即字符编码)值大于0xFFFF,则将其减去0x10000,之后,在该数字的前10位(bits)加上0xD800,就得到UTF-16四字节编码中的前两个字节(第一个码元);该数字的后10位(bits)加上0xDC00,得到后两个字节(第二个码元)。

就拿上面的例子说:

'😊':Unicode编码位0x1F60A

0x1F60A - 0x10000 = 0xF60A = 0x0F60A = 0000 1111 0110 0000 1010

前10bits = 00 0011 1101 = 0x03D

后10bits = 10 0000 1010 = 0x20A

前10bits + 0xD800 = 0x03D + 0xD800 = 0xD83D

后10bits + 0xDC00 = 0x20A + 0xDC00 = 0xDE0A

可以看到,通过UTF-16的转换规则,将码点为0x1F60A的字符,转换为0xD83D和0xDE0A两个码元。

码元、码点和字符串相关的方法
1. 获取指定位置的码元

String.proto.charCodeAt(index)

上面也提到过,string.length返回码元的个数,所以这里的index有效范围是[0, length - 1]

2. 获取指定位置的字符(如果可以用一个码元进行编码,码元的值和码点的值相等)

String.proto.charAt(index)

charCodeAt()一个返回的是码元(数值),而charAt()返回码元对应的字符,如果一个字符有多个码元,这里仅仅取出其中一个码元,并把它当作码点,就会出现乱码。

3. 将字符串指定位置的码元转换成码点(如果是多个码元表示的码点,从指定位置开始,取多个码点进行转换)

String.proto.codePointAt(index)

如图,“笑脸”码元开始的位置是1;当传入2的时候,下标2位置对应的是“笑脸”的第二个码元,不是完整的两个码元开始的位置,所以直接返回了第2个码元,而不是转换成码点返回。

4.通过码元创建字符串

String.proto.charCodeFrom(...charCode)

将码元转换成字符串

5.通过码点创建字符串

String.proto.codePointFrom(...codePoint)

根据上面的解释我们可以得到最新的字符串截取函数

const str = '你好😊😂🤣😍哈哈';

//在String的原型上加pointLength用于判断长度
String.prototype.pointLength = function(){
    let len = 0;
    for (let i = 0; i < this.length;) {
        const codePoint = this.codePointAt(i);
        i += codePoint > 0xffff ? 2 : 1;
        len++;
    }
    return len;
}

//在String的原型上加pointAt用于获取指定下标内容
String.prototype.pointAt=function(index){
    let curIndex = 0;//码点的下标
    for (let i = 0; i < this.length;) {
        const codePoint = this.codePointAt(i);
        if (curIndex === index) {
            return String.fromCodePoint(codePoint);
        }
        i += codePoint > 0xffff ? 2 : 1;
        curIndex++;
    }
}

//在String的原型上加sliceByPoint用于截取字符串
String.prototype.sliceByPoint = function(start=0,end=this.pointLength()){
    let res = '';
    for (let i = start; i < end; i++) {
        res += this.pointAt(i);
    }
    return res;
}

console.log(str.pointLength());//8
console.log(str.pointAt(3));//😊
console.log(str.sliceByPoint(2,4));//😊😂

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言爬取HTML-爬取壁纸 文末附源码

前言&#xff1a;这学期计算机软件课程设计的其中一个题目是使用C语言爬取HTML&#xff0c;本打算使用C语言的CSpidr库来实现&#xff0c;但是因为它的依赖liburi没有找到在哪里安装&#xff0c;所以放弃了这个想法&#xff0c;使用的是curl以及libxml2这两个库&#xff0c;能够…

这几款实用且有趣的软件不容错过

软件一&#xff1a;天若ocr 这款Windows平台的天若OCR文字识别工具一定更适合你。 软件作者来自天若游心&#xff0c;我爱破解。 发布一年半以来一直深受好评&#xff0c;更新速度也非常快。 最近&#xff0c;它增加了批次识别功能。 软件二&#xff1a;腾讯柠檬精简版 除了Q…

P2233 [HNOI2002]公交车路线

题目描述 在长沙城新建的环城公路上一共有 8 个公交站&#xff0c;分别为 A、B、C、D、E、F、G、H。公共汽车只能够在相邻的两个公交站之间运行&#xff0c;因此你从某一个公交站到另外一个公交站往往要换几次车&#xff0c;例如从公交站 A 到公交站 D&#xff0c;你就至少需要…

keycloak介绍与使用示例,超时时间设置

keycloak介绍 Keycloak是一款由Red Hat开源社区开发的开放源代码的身份和访问管理解决方案&#xff0c;它提供了安全的单点登录(SSO)、多因素身份验证、社交登录和基于角色的访问控制等功能Keycloak基于OAuth 2.0和OpenID Connect协议&#xff0c;并支持SAML 2.0&#xff0c;可…

spring Bean的循环依赖问题

public class Husband {private String name;private Wife wife;public void setName(String name) {this.name name;}public String getName() {return name;}public void setWife(Wife wife) {this.wife wife;}// toString()方法重写时需要注意&#xff1a;不能直接输出wif…

【计算机网络基础】章节测试2 物理层

文章目录 判断题选择题辨析题应用题 判断题 现在的无线局域网常用的频段是2.8GHz和5.4GHz。 多模光纤只适合于近距离传输。√ 数据在计算机内部多采用串行传输方式&#xff0c;但在通信线路上多采用并行传输方式。 统计时分复用可以按需动态分配时隙。√ 相对于同步时分复用…

卷麻了,新来的00后实在是太卷了...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

geoserver切片数据本地缓存和层级配置

很多业务场景中&#xff0c;我们会用到图层切片功能&#xff0c;默认情况下&#xff0c;每次调用都是新的重新切片&#xff0c;这样在性能上存在一定问题&#xff1b;基于此我们可以进行本地缓存切片&#xff0c;及此地理位置只进行一次切片处理&#xff0c;数据缓存在本地磁盘…

基于Python实现线性分类器

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 在机器学习领域&#xff0c;分类的目标是指将具有相似特征的对象聚集。而一个线性分类器则透过特征的线性组合来做出分类决定&#xff0c;以达到此种目的。对象的特征通常被描述为特征值&#xff0c;而在向量中则描述为特征向…

Visual studio 配置intel realsense sdk环境

前面的部分已经有博主写过了&#xff0c;这里就不赘述了&#xff0c;附上链接&#xff1a;VS配置使用realsense相机SDK 仅仅配置上述文章中的部分&#xff0c;运行realsense example的部分例子程序时会出现找不到glfw3.h的问题。我查找了github上的提问发现这个问题原因是没有…

网络安全中NISP二级证书和CISP证书的优势有什么

优势&#xff1f;那就需要多个点展开说说啦~ 1.权威含金量高 我国信息安全领域唯一的国家级注册安全专业人员证书 2.就业面宽&#xff0c;企业优先选择证书持有者 通过专业培训和考试提高个人信息安全从业水平&#xff0c;证明具备从事信息安全技术和管理工作的能力&#x…

opencv二值化详解

大家好&#xff0c;今天来跟大家讲讲 opencv二值化。 先从一个比较经典的方法开始讲解&#xff0c;看 opencv官方文档&#xff1a; 二值化&#xff08;binary&#xff09;的定义&#xff1a;在一个输入图像中&#xff0c;将其一个像素点设置为0,将其两个像素点设置为1。 二值化…

开发笔记之:文件读取值溢出bug分析(QT C++版)

&#xff08;1&#xff09;引言 以下是QT C读取数据文件&#xff08;QDataStream&#xff09;的代码&#xff1a; /*** 按双字读取* param fis 文件输入流* param isBigEndian 是否大头&#xff08;字节序&#xff09;* return 双字值*/ DWORD FsFileUtil::readAsD…

怎么用问卷工具做市场调研?

对于希望开发新产品或服务、拓展新市场或确定潜在客户的公司来说&#xff0c;市场调查是一个至关重要的过程。然而&#xff0c;进行市场调查可能既耗时又昂贵&#xff0c;特别是在涉及对大量人群进行调查的情况下。今天&#xff0c;小编将来聊一聊调查问卷工具如何帮助企业进行…

微信小程序-基础知识

文章目录 AppIdOpenIDUnionId处理方法session_key AppId appid 是微信账号的唯一标识&#xff0c;这个是固定不变的&#xff1b; 如果了解微信公众号开发的就需要注意一下&#xff0c;小程序的appid 和 公众号的appid 是不一致的 OpenID 为了识别用户&#xff0c;每个用户针…

如何成为自动化测试工程师?8年测试总结,自动化测试岗晋升的技能...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

程序设计入门——C语言2023年5月18日

程序设计入门——C语言 第二周 计算表达式 课程来源&#xff1a;链接: 浙江大学 翁恺 程序设计入门——C语言 学习日期&#xff1a;2023年5月18日 第二周 计算 表达式 有两个变量a和b&#xff0c;交换a和b的值。 老师举例&#xff1a;有两杯液体&#xff0c;一杯茶&#xff…

03)FastDFS配置nginx 服务,使用http方式访问图片

FastDFS是没有文件访问功能的,需要借助其他工具实现图片HTTP访问的。 没安装nginx时比如前端html网页想获取 FastDFS的一张图片显示,需要java写个controller,然后使用 FastDFS-java client客户端调用文件获取api,HttpServletResponre在返回图片流.给前端显示。 安装了nginx…

HTTP介绍、原理

HTTP 与 HTTPS 有哪些区别&#xff1f; HTTP 是超文本传输协议&#xff0c;信息是明文传输&#xff0c;存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷&#xff0c;在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议&#xff0c;使得报文能够加密传输。HTTP 连接建立相…

带头 双向 循环 链表——C语言实现

既然有带头 那么就有不带头 为什么我要将带头 而不讲不带头&#xff1f; 在之前我讲单链表时就说过 如果不带头会出现讨论的情况 为什么会出现讨论的情况 假设链表有一个节点 进行尾插 就只是将新的节点连接到链表的尾节点之后 那么如果链表没有节点 就没有尾节点 自然也就不能…