字符与编码
字符集
任一字符的二进制映射表
ASCII: 将字符按照ASCII表采用8位二进制标识(英文字母字符)
ISO: 将字符按照ISO表采用8位二进制标识(额外欧洲字符)
GBK: 兼容ASCII编码,2个字节表示中文字符(额外中文字符)
Unicode: 统一所有字符,支持3个字节多区间编码标识任一字符
编码规则
传统字符集相对应的字符编码,
Unicode由于字符广泛,UTF-32、UTF-16、UTF-8编码规范标识特定字符
UTF-32:定长 32位码元(代码单元位数) 1字节长度编码
UTF-16:定长 16位码元(代码单元位数) 2/4字节长度编码
UTF-8:不定长 8位码元(代码单元位数) 1/2/3/4字节长度编码
注: JavaScript采用UTF-16对Unicode字符编码存储
JS相关
String.length
String 实例的 length 返回字符串的 UTF-16 码元长度
String.length
永远返回1(length方法形参数)
TextEncoder
new TextEncoder()
接收字符串类型参数,用 UTF-8 编码将码位流转换成字节流( Uint8Array)
Emoji
表情字符不例外包含在Unicode字符集内
常见问题
表情字符
emoji字符被UTF-8编码后,在其他编码(如JS中UTF-16)读取时,字符length结果为2及以上;
位置校准
基于UTF-8编码字符的位置信息,如何js准确截取对应位置字符
const indexDictionary = [];
[...articleInfo.value.content].reduce((total, chat) => {
indexDictionary.push(total);
return total + chat.length;
}, 0);
string.charAt(indexDictionary[index]) // string的index处字符,读取表情需额外处理
字符数校准
输入框长度直接使用 String.length,当内容存在表情时长度值不准确,更无法准确限制输入内容长度
其它
Twemoji
推特提供了一组可嵌入到网页和应用程序中的 Emoji 图标,将Emoji 文本转换为 Emoji 图片(svg/png)展示,实现跨系统/平台/浏览器任一表情支持
emoji
处理和操作 Emoji 表情的功能