18910140161

关于JS中字符串的编码各种解决方法

顺晟科技

2021-06-16 10:40:48

357

字符编码

Unicode作为字符编码的标准,使用代码点来索引字符(通用标识符),字符编码用于识别代码点。字符编码被视为一个编码单位。在JavaScript中,字符串基于16位字符编码(UTF-16,Unicode的一种)来构造编码单位(用十进制或十六进制表示)。

前65,535个字符代码称为基本多语言平面(BMP),一个代码标识一个代码位。当超出BMP范围时,会用两个代码(代理对)来识别一个代码点,称为辅助平面字符。大部分字符在BMP范围内,部分字符在辅助平面内,这就产生了一些问题,比如汉字“:

let str=

//字符串的length属性基于编码单元返回的长度

//因为不在BMP范围内,所以字符" "为2(两个16位代码)

str.length//2

/^.$/.测试(str);//false

str . charat(0);//''

str . charat(1);//''

获取实际字符数

因为String.length是用编码单位数来计算长度的,所以遇到有两个编码单位的晦涩单词,比如"",在计算字符数时会有偏差。在ES6标准中,正则表达式的修饰符/u会将字符匹配模式从编码单元模式切换到字符模式,所以可以通过正则匹配来计算字符数:

/^.$/u . test(str);//true

str.match(/)。/gu)。长度;//1

应该注意的是当。match()方法与内容不匹配,会返回null,而且这种方法处理长字符串开销很大。

获取十进制代码点

//charCodeAt code point区别在哪里

str . charcodeat(0);//55362

str . charcodeat(1);//57271

str . codepointat(0);//134071

str . codepointat(1);//57271

134071.toString(16);//转换为十六进制0x20bb7

两者。charCodeAt()和。codePointAt()方法可以获取字符编码的十进制值。区别在于。codePointAt()方法可以获取代理对标识的代码点的小数值,也是最终指向字符的完整字符编码的小数值。

通过代码位获取相应的字符

//String.fromCharCode编码BMP范围以外的字符,无法正确获取对应的字符

string . FromCharCode(134071);//''

string . FromCharCode(55362);//''

//只能通过String.fromCodePoint获取

string . FromCodePoint(134071);//''

string . FromCodePoint(55362);//''

确定是否超过BMP范围

//通过分析Unicode,可以判断是否超出BMP范围(16位上限FFFF,小数为65535)

console . log(str . codepointat(0)0xfffff);//true

整句拆分

//只需使用。split()方法将根据代码而不是字符来拆分字符,因此单词“”被拆分成两个乱码

console . log(str . split('));//['', '']

//可以在match方法的正则表达式中添加修饰符u

console.log(str.match(/)。/gu))/[' ']

//for.声明

let word=[];

for(let char of str){

words . push(char);

}

console . log(word);//['']

字符编码的标准化

Unicode序列有很多规则。在ES6中,字符串序列(“NFC”、“NFD”、“NFKC”和“NFKD”)由统一。normalize(),它影响比较操作等操作的结果,例如以下排序操作:

Let str='文本排序前带标准化的cba ',

字数=[];

For(让char of ' standard before text sorting CBA '){

words . push(char);

}

word . sort((a,b)={

设an=a.normalize(),//两者使用相同的标准,默认为“NFC”

bn=b . normalize();

if(anbn){

return-1;

}else if(an===bn){

返回0;

}else{

返回1;

}

});

console . log(word);//得到统一标准后的排序结果

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航