字符与编码

Posted by page on October 31, 2023

字符与编码

字符集

任一字符的二进制映射表

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 表情的功能