个人笔记---字符集

230 阅读1分钟

定义

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。

范围

rfc3629标准定义的范围为:U+0000到U+10FFFF。

编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。

Unicode范围 utf-8 字节数(byte) 备注
U+0000 - U+007F 0XXX XXXX 1 1字节=8位=256个。因为0被定死了,所以只有128个(0-127, U+007F=127)。
U+0080 - U+07FF \overbrace{11}^{n=2}0X XXXX

10XX XXXX

2 110x 其中11为字节数个1(字节数为n, 则n个1),0为固定值。
U+0800 - U+FFFF \overbrace{111}^{n=3}0 XXXX

10XX XXXX

10XX XXXX
3
U+10000 - U+1FFFFF \overbrace{1111}^{n=4} 0XXX

10XX XXXX

10XX XXXX

10XX XXXX
4 因为rfc3629规定,实际用到的范围只有U+10000 - U+10FFFF。

javascript 判断utf8字符串的字节数

function getUTF8Byte(str) {
  if (!str) {
    return 0
  }

  let byteCount = 0
  for (let i = 0; i < str.length; i++) {
    const ascii = str.charCodeAt(0)
    if (ascii <= 0x007F) {
      byteCount++
    } else if (ascii <= 0x07FF) {
      byteCount += 2
    } else {
      byteCount += 3
    }
    // utf8 被RFC 3629规范为只能到0x10FFFF, 所以以下判断就没用了
    // else if (ascii <= 0xFFFF) {
    //   byteCount += 3
    // }
    // else if (ascii <= 0x1FFFFF) {
    //   byteCount += 4
    // } else if (ascii <= 0x3FFFFFF) {
    //   byteCount += 5
    // } else if (ascii <= 0x7FFFFFFF) {
    //   byteCount += 6
    // }
  }
  return byteCount
}