substring截取字符串有时候截取不到

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了substring截取字符串有时候截取不到相关的知识,希望对你有一定的参考价值。

substring截取字符串有时候截取不到是因为substring的参数设定错误所导致的。例如,如果两个参数的值相同,或者第一个参数的值大于第二个参数的值,那么就会截取不到子字符串。此外,如果参数的值超出字符串的长度,也会出现截取不到的情况。 参考技术A 之前在获取元素属性时,踩了个坑,记录一下,下面这篇文章主要给大家介绍了关于JS字符串截取出现的bug以及解决方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
前言
在js中我们对字符串进行一部分截取,可以使用slice()函数截取,也可以直接用substring()函数来截取,但是截取也有可能出bug

const str='小𠮷和小𧨁今天吃了50块钱的KFC'
console.log(str.slice(0,5));

可以在控制台看到,本来应该截取的字符串是'小𠮷和小𧨁'才对,却少了一个字,这是什么原因呢?

js的字符编码
在很早的时候,js使用的编码规范是16位的字符编码(USC-2),规定了每一个字对应16位的空间,16位的空间称为码元,字符串的所有属性和方法(像是 length 属性和 chatAt 方法)都是基于 16 位的码元,但是后来生僻字越来越多,16位的空间不够用了

就把编码方式换成了utf-16,utf-16允许一个文字占用16位的空间也就是一个码元或者32位的空间就是两个码元,一些特殊的文字就占用了两个码元,像'𠮷'和'𧨁'就占用了两个码元

使用码元截取的bug

我们使用的length属性实际上数的是码元的数量,而使用slice()方法截取字符串是根据下标来截取的,下标也是指的码元的下标

比如我们截取'小𠮷'这两个字,将slice()截取的范围改为0到1也就是console.log(str.slice(0,2)), '𠮷'占用了两个码元,slice()只截取到了它第一个码元的值,一个码元形不成文字,这样得到的就不是一个完整的字,而是一个乱码了

使用码点来正确截取字符串
既然使用码元获取不到正确的字符,那就可以使用码点来截取了,什么是码点呢?码点不管你占用多少空间,一个文字就占一个码点,一个码点对应一个码元或者两个码元,使用码点截取就要写一个截取的函数了

我们在字符串的原型对象上新建一个函数,传入一个截取的起始坐标和结束坐标,准备好一个result变量存储最终截取到的结果,和两个代表码元和码点指针的变量

String.prototype.strSlice=function(sStart,sEnd)//截取的起始坐标和结束坐标
let result='' //截取的结果
let dI

以上是关于substring截取字符串有时候截取不到的主要内容,如果未能解决你的问题,请参考以下文章

有时候不用explode截取字符串了,可以用用substr()

PHP怎么用substr函数截取字符串中的某部分

PHP 截取字符串后乱码的解决方案

substring如何截取最后几个字符

Vue 截取字符串substring()substr()

c#中substring中怎么截取字符串