字符集
字符集(charset)是一个集合,集合中的元素就是字符,比如unicode字符集,其中的字符就是'A'、'B'等字符。
编码字符集
为了在计算机中处理字符集,必须把字符集数字化,就是给字符集中的每一个字符一个编号,计算机程序中要用字符,直接用这个编号就可以了。于是就出现了编码后的字符集,叫做编码字符集(encoding)。比如utf-8编码。
代码点
编码字符集中每一个字符都和一个编号对应。那么这个编号就是代码点(Code Point)。例如“严”字在Unicode中对应的码点是U+0x4E25。
代码单元
代码单元是把代码点存放到计算机后出现的概念。一个字符集,比如有10个字符,每一个字符从0到9依次编码。那么代码点就是0、1、。。。、9。为了在计算机中存储这10个代代码点,一个代码点给一个字节,那么这里的一个字节就是一个代码单元。比如Unicode是一个编码字符集,其中有65536个字符,代码点依次为0、1、2、。。。、65535,为了在计算机中表示这些代码点就出现了代码单元,65536个代码点为了统一表示,每个代码点必须要有两个字节表示才行。但是为了节省空间0-127的ASCII码就可以不用两个字节来表示,只需要一个字节,于是不同的表示方案就形成了不同的编码方案,比如utf-8、utf-16等。对utf-8而言代码单元就是一个字节,对utf-16而言代码单元就是两个字节。
相关api
string.prototype.codePointAt(index)
作用:以十进制返回该字符串index索引处的码点值。
eg:'A'.codePointAt(0); // 65
String.fromCodePoint(num1[, ...[, numN]])
入参:一串 Unicode 编码位置,即“代码点”。单个入参对应codePointAt的返回值。
作用:返回指定的 Unicode 编码(代码点)对应的字符串。
eg:String.fromCodePoint('A'.codePointAt(0)); // A
string.prototype.charCodeAt(index)
作用:以十进制返回该字符串index索引处的码元值。
eg: 'A'.charCodeAt(0); // 65
string.prototype.chaAt(index)
作用:返回指定字符串index索引处对应的字符。
eg:'AB'.charAt(0); // A
String.fromCharCode(num1[, ...[, numN]])
作用:返回由指定的 UTF-16 代码单元序列创建的字符串。
eg:String.fromCharCode('A'.charCodeAt(0)); // A
解决string.prototype.slice处理特殊字符乱码的问题
eg: var s = '😊';s.slice(1); // \uDE0A
因为😊由两个码元组成,而slice的参数是指码元的索引,而笑脸的索引为1的码元为56842,而该值对应的字符串
通过String.fromCharCode(56842)可得为\uDE0A,导致了乱码。
String.prototype.fromPointAtOfPointIndex = function(start, end) {
let pointIndex = 0;
let charIndex = 0;
let result = '';
for (;;) {
if (charIndex >= this.length || pointIndex >= end) {
break;
};
const point = this.codePointAt(charIndex);
if (pointIndex >= start) { result += String.fromCodePoint(point) }
charIndex += point > 65535 ? 2 : 1;
pointIndex++;
}
return result
}
参考链接: