由于slice截取规则是根据码元进行截取、因而有时针对多码元字符会出现截取失误的问题
为String的原型增加依据码点截取字符的自定义方法
String.prototype.sliceByPoint = function (pStart,pEnd) {
let result = '' //截取的结果
let pIndex = 0 //码点的指针
let cIndex = 0 //码元的指针
while(1){
//当码点指针超出截取范围或者码元指针超出字符串长度时结束循环
if (pIndex >= pEnd || cIndex >= this.length) {
break
}
pIndex++
const point =this.codePointAt(cIndex);
if (pIndex > pStart) {
result += String.fromCodePoint(point) //根据码点恢复字符
}
cIndex += point > 0xffff ? 2 : 1; //判断码点所在字符是否占据两位码元
}
return result;
}
var str='🐟小🐟鱼🐟儿🐟'
console.log(str.slice(0,5));
console.log('---------------');
console.log(str.sliceByPoint(0,5));