ES6中Unicode的改动 正则和字符串的变动 codePointAt

二、字符串正则表达式 javascript正则表达式ES6正则表达式 阅读详情

ES6中Unicode的改动

早期,由于储存空间宝贵,Unicode使用16位二进制来储存文字,我们将一个16位的二进制编码叫做一个码元(Code Unit)。
后来由于技术的发展,Unicode对文字编码进行了扩展,将某些文字扩展到了32位(占用两个码元),并且,将某个对应的二进制数字叫做码点(Code Point)。


	//此时就产生了一个问题
	//在这里我写了一个字符串这个字是一个生僻字读ji
	const text = '吉';
	
	//而我在这里用.length的方法来测试字符串的长度
	console.log('字符串长度:', text.length);
	//用正则表达式来检索看看能不能检索到
	console.log('使用正则测试:', /^.$/.text(text));

而结果是
在这里插入图片描述
???
不应该对吧,字符串长度应该为1
正则表达式应该是能检索到字符串的啊,应该是为ture

那是因为现在有些文字要占用两个码元,有的文字占用一个码元,而js在很早之前1999年的时候已经有10年没有更新了一个语言有10年没有更新是多么可怕的一件事啊。所以在当时的语法中他认为一个码元就对应一个文字而有的文字实际上是占用了两个码元就会导致这样的结果发生。

所以就会出现字符串的长度是2因为它占用了两个码元,正则匹配时也是因为匹配的是两个码元所以匹配不到。

那么ES6中能不能改动这些呢,能!但是不敢,因为他不敢保证以前的一些旧系统都能兼容。虽然在ES6中还没有改但是他折中了一下。

在ES6中为了解决这个困扰,为字符串提供了方法:codePointAt

	
	//以前能够做到的
	console,log('得到第一个码元', text.charCodeAt(0).toString(16));//  \ud842  55362
	console,log('得到第二个码元', text.charCodeAt(1).toString(16));//  \udfb7  57271
	
	//现在
	console.log('得到第一个码点:', text.codePointAt(0));
	//他会读取第一个码元,看,这占用的不止一个码元会把下一个码元也读取出来所以会输出一个完整的编码
	console.log('得到第二个码点:', text.codePointAt(1));
	//能不能读出来呢,能,但是他看着一半的编码因为不是第一个码元所以会将第二个码元原封不动的输出

同时ES6为正则表达式添加了一个flag: u,如果添加了该配置,则匹配时使用码点来匹配。


	console.log('使用正则测试:', /^.$/u.text(text));

那么我们可以用它来干什么呢

比如说我们遇到了一个需求需要去测试一个字符串中的长度那么这个字符串中刚好有这样的生僻字,导致了字符串长度的测量不准南无我们就可以利用此方法来测试


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

/**
 * 得到一个字符串码点的真实长度
 * @param {*} str 
 */
function getLengthOfCodePoint(str) {
    var len = 0;
    for (let i = 0; i < str.length; i++) {
        //i在索引码元
        if (is32bit(str, i)) {
            //当前字符串,在i这个位置,占用了两个码元
            i++;
        }
        len++;
    }
    return len;
}

console.log("𠮷是否是32位的:", is32bit("𠮷", 0))
console.log("ab𠮷ab的码点长度:", getLengthOfCodePoint("ab𠮷ab"))

这就是这ES6中Unicode的一些改东西希望对你有用

从零到多智能体:Google Agent开发套件(ADK)入门指南 ADK促进自定义工具生产的能力是其优势之一。本质上,工具只是一个带有描述性文档字符串的Python函数。 阅读详情

相关推荐

28-手把手教你手写CPU-Verilog - 乘法器设计:Booth算法与Wallace树乘法器

文章摘要: 本文详细介绍了两种高效乘法器设计方法:Booth算法Wallace树乘法器。Booth算法通过检测乘数连续1/0减少部分积,适合有符号数运算;Wallace树采用树形结构压缩部分积,显著降低延迟。文章包含算法原理、具体示例、Verilog实现代码(4位乘法器)及性能对比表,指出Booth适用于通用处理器,Wallace树更适合高性能DSP/GPU。最后强调实际设计中需根据速度、面积功耗需求选择合适方案。

2301_79143213的博客 180

day14 ES6(let、const、this、bind、箭头函数、解构赋值、字符串扩展方法)

一、Let let等价于var,也是用来声明变量的 let的特点: 1,变量必须先定义后使用 2,变量不能重复定义 3,块级作用域:在该块的范围内才能使用该变量,且该变量不会消失 4,暂时性死区:当内部变量与外部变量同名时,内部变量屏蔽外部变量 二、const const修饰的变量为只读变量 1,变量只能读不能改 2,被conset修饰的变量必须被初始化 3,必须先定义后使用 4,不能重复定义 5,块级作用域 规定:只读变量名通常全部大写 三、this this:函数的内置对

serendipitymm的博客 156

TransUnet复现,完整代码(附实现说明)

TransUnet复习,完整代码(附实现说明)

探索ES2018的强力新武器:正则表达式中的Unicode属性转义

探索ES2018的强力新武器:正则表达式中的Unicode属性转义 去发现同类优质开源项目:https://gitcode.com/ 引言:解锁Unicode的力量 随着ECMAScript规范的不断演进,JavaScript迎来了一项里程碑式的特性——Unicode属性转义。这一功能在ES2018中正式加入,为处理多语言环境下的文本验证筛选提供了更为便捷高效的方式。本文将深入浅出地介绍这项特...

gitblog_00094的博客 549

unicode中含有双码元字符串的截取

Char[] cc = "

jimil的专栏 1613

JavaScript字符串操作方法大全(ES6新增)

一、codePointAt() let s = '

你好瘦 369

ES6 入门教程 5 字符串的新增方法 5.1 String.fromCodePoint() & 5.2 String.raw() & 5.3 实例方法:codePointAt()

ES6 入门教程 5 字符串的新增方法 5.1 String.fromCodePoint() & 5.2 String.raw() & 5.3 实例方法:codePointAt()

代码改变世界 508

16进制 es6_ES6unicode的支持

Chrome 内置抓包工具Block requests截取长图代码的覆盖率分析Make site betterES5只支持\uffff(65535)以内的unicode比如你写"\u22000" //在unicode中对应为生僻字:????但是最后展示为:"∀0"。结论:JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode ...

weixin_39932181的博客 230

ES6 字符串正则表达式(三)

更好的Unicode支持 早期,由于存储空间宝贵,Unicode使用16位二进制来存储文字。我们将一个16位的二进制编码叫做一个码元(Code Unit)。 后来,由于技术的发展,Unicode对文字编码进行了扩展,将某些文字扩展到了32位(占用两个码元),并且,将某个文字对应的二进制数字叫做码点(Code Point)。 ES6为了解决这个困扰,为字符串提供了方法:codePointAt,根据字符串码元的位置得到其码点。 同时,ES6正则表达式添加了一个flag: u,如果添加了该配置,则匹配时,使用码

lzDevastator的博客 260

ES6 字符串正则的的扩展

1.字符串的扩展 (1)字符串的遍历器接口 for ...of for (let codePoint of "foo") { console.log(codePoint); } //"f" //"o" //"o" (2)JSON.stringify() 的改造 根据标准,JSON数据必须是 UTF-8 编码。但是现在的 JSON.stringify()方法可能返回不符合 UTF-8 标准的编码 JSON.stringify()的问题在于,它可能返回 0xD800到0xDFFF之间的.

JMisagirl的博客 303

Javascript的字符串String的编码之unicode的处理

首先确定的是Ecmascript使用的是一种UTF-16的编码,但是这种编码却不是标准的UTF-16编码的处理方式。 前言 unicode 2.0引入了utf-16编码,unicode3.0更精确的定义UTF-16编码。 参考:https://iamzero.blog.csdn.net/article/details/113123384 1999年ES3.0发布,该版本的Ecmascript直接规定了String类型的编码使用UTF-16,但是对String依然按照单个code unit

lengye7的博客 4189

ES6字符串正则表达式

目录 1.Unicode支持 2.新增字符串API 3.正则中的粘连标记 4.模板字符串 1.Unicode支持 早期由于存储资源有限,Unicode使用16位二进制来存储文字,我们将一个16位二进制编码叫做一个码元(code unit)。 后来由于技术的发展,Unicode对文字编码进行了扩展,将某些文字扩展到了32位(占用了两个码元)【例1-1】,并且将某个文字对应的二进制数字...

桃花扇的博客 646

【深入理解ES6字符串正则表达式

字符串(String)是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol(es6新增)。

m0_62811051的博客 1126

ES6--字符串新增的方法

ES6--字符串新增的方法一、子串的识别(1)includes():返回布尔值,判断是否找到参数字符串。(2)startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。(3)endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。二、字符串重复--repeat()三、字符串补全(1)padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。(1)padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。四、String.fromCodePo.

赵佳敏的博客 1157

ES6——5.字符串的新增方法

0xFFFF上面代码中,如果方法有多个参数,则它们会被合并成一个字符串返回。String。

chtazycdf的博客 593

JavaScript字符串长度[String].length以及码元[Code Point]码点[Code Unit]出现的问题的详解

JavaScript字符串长度[String].length以及码元[Code Point]码点[Code Unit]的详解码元,码点出现的问题码元(Code Point):我们将一个==16位==的二进制编码叫做一个码元码点(Code Unit):我们将某个==文字对应的二进制数字==叫做码点由于码元,码点产生的问题---[string].length运行代码打印出: ==1 true...

一只勤劳的二哈的博客 1028

码元码点(字符串截取截取得是码元,汉字有一些偏僻字占据两个码元,字符的函数往往不是我们期待)

字符串截取截取得是码元,汉字有一些偏僻字占据两个码元,字符的函数往往不是我们期待

qq_38761664的博客 747

了解js字符串的码元与码点

charCodeAt与codePointAt的用法 相同点: charCodeAt与codePointAt都是字符串实例的方法,用途都是返回指定索引位字符的Unicode编码 不同点:charCodeAt与codePointAt匹配索引位的规则不一样,charCodeAt是根据码元来匹配,而codePointAt是根据码点来进行匹配的 码元与码点 这两点都与计算机编程有关,早期的时候,存储空间比较宝贵,unicode存储文字,16位2进制叫做一个码元(code unit) 计算机发展,对unicode文字

weixin_45846805的博客 1892

codePointAt()方法

codePointAt()方法JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode 码点大于0xFFFF的字符),JavaScript 会认为它们是两个字符。var s = "?";s.length // 2s.charAt(0) // ''s.charAt(1) // ''s.charCodeAt(0) // 553

歪脖先生的博客 1万+

关于阅读 ES6- 字符串 整理的问题

1、字符的码点超出 \u0000-\uffff时怎么进行表示呢 答:方式1:使用双字节表示,例如 ‘\uD842\uDFB7’ 方式2:ES6中增加大括号表示法,例如 \u{20BB7}‘’ 2、每个字符有几个字节呢 答:Unicode码点小于 \uffff,一个字符有两个字节 Unicode码点大于\uffff,一个字符有四个字节 3、JavaScript有几种表示字符的方式呢 答:六种,例如表示 字符z ‘z’ ‘\z’ ‘\172’ ‘\x7A’ ‘\u007A’ ‘\u{7A}’ 4、s

千里之行,始于足下! 467

ES6笔记上(深入浅出ES6—阮一峰)

在线转换 Babel 提供一个REPL在线编译器,可以在线将 ES6 代码转为 ES5 代码。转换后的代码,可以直接作为 ES5 代码插入网页运行。

阿蔡的博客 7万+
上一篇: ES6 const概述,声明常量
下一篇: ES6更多的字符串的API
苟盛
博客等级 码龄7年 13粉丝 34原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值