Skip to content

Latest commit

 

History

History
26 lines (22 loc) · 1.39 KB

unicode.md

File metadata and controls

26 lines (22 loc) · 1.39 KB

对于这个概念,可以从一个问题去延展开来,详细文章: js与字符集编码

为什么在 js 中 emoji 的长度为 2 ,中文和数字的长度都为 1?

  • js 的编码方式
    • 运行时:早期设计语言时用 ucs-2 ,现在是 utf16。
    • 就是表示用 2 个字节代表一个字符,所以我们说长度为 1 的字符都是说它的字节有 2 个
  • 什么是 utf-16
    • 是一种编码方式,用 16 进制表示。
    • 1 个字节有 8 位二进制,一位 16 进制转换成二进制表示有 4 位,所以 2 位 16 进制代表一个字节,一个字节的 16 进制范围是 00 ~ ff
  • 那么为什么是 2 个字节表示一个字符呢?
    • unicode 用 utf16 表示字符对应的码点范围为 0000 ~ 10ffff,有 0010 = 16 个平面,基本平面最多 ffff = 65535 个字符
    • 也就是说一个基本平面的字符是一个 16 进制数,16 进制用 4 位来表示。
    • 由上我们知道 2 位 16 进制代表一个字节,所以一个 unicode 字符有 2 个字节。
    • 在 unicode 码点用 10 进制表示,我们可以先求码点,再转换成 16 进制来验证
    '我'.codePointAt()
    // 25105
    
    25105..toString(16)
    // "6211"
    
    '\u6211'
    // "我"
    • 由于 emoji 表情不在基本平面内,由 2 位 16 进制数表示,所以是 4 个字节,长度为 2.