字符编码

如何显示一个字符

需要:

  • 字符集
  • 字符编码
  • 字体

字符集

Unicode

统一码联盟,他们由Xerox、Apple等软件制造商于1988年组成,并且开发了Unicode标准。

USC

国际标准化组织(ISO),他们于1984年创建ISO/IEC JTC1/SC2/WG2工作组,试图制定一份“通用字符集”(Universal Character Set,简称UCS),并最终制定了ISO 10646标准。

其他

ASCII、GB2312等也是字符集,但是它们的码值与在计算机中存储的字节码相同,就直接在字符编码中介绍了。

字符编码

  • MDN:一套编码系统定义字节与文本间的映射。
  • 维基百科:把字符集中的字,编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。
  • 狗蛋儿:人将字符集合与字节码一一映射后得到的字符表,可以从这个表中通过字节码获得对应的字符。

ASCII

主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。

  • 字节数:单字节
  • 字符数:128
  • 规则:
    00x7F

GB2312

GB2312,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。

  • 字节数:双字节
  • 字符数:6763
  • 规则:
    第一个(高)字节的范围:0xA10xFE,共 94 ,设定为94个区
    第二个(低)字节的范围:0xA20xFF,共 94,与第一个字节组合,即表示每个区有94个字符

GBK

GBK 向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。

  • 字节数:双字节
  • 字符数:21886
  • 规则:
    第一个字节的值从 0x810xFE
    第二个字节的值从 0x400xFE(不包括0x7F

GB18030

国家标准 GB 18030-2005《信息技术中文编码字符集》,是中华人民共和国现时最新的内码字集,是 GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版。

  • 字节数:多字节,单、双、四
  • 字符数:70244
  • 规则:
    • 单字节
      00x7F,与 ASCII 编码兼容
      • 双字节
        第一个字节的值从 0x810xFE
        第二个字节的值从 0x400xFE(不包括0x7F),与 GBK 标准兼容
    • 四字节
      第一个字节的值从 0x810xFE
      第二个字节的值从 0x300x39
      第三个字节从 0x810xFE
      第四个字节从 0x300x39

UTF-8

为了解决使用 Unicode 时,英文字符空白字节占位多,造成浪费问题。对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

  • 字节数:单、三、四
  • 规则:
    Unicode符号范围(十六进制) UTF-8编码方式(二进制)
    0000 0000 - 0000 007F 0xxxxxxx
    0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
    0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
    0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

USC-2

可以为全世界最常用的63K字符编码。

  • 字节数:双
  • 规则:
    0 到 0xFFFF,不包括(0xD8000xDFFF

UTF-16

两个字节时可为全世界最常用的63K字符编码,与UCS-2一样;四个字节对不常用的字符进行编码。

  • 字节数:双、四
  • 规则:
    • 双字节
      0 到 0xFFFF,不包括(0xD8000xDFFF
    • 四字节
      1. U+10000 ~ U+10FFFF 的码值,用字节表示,即 0x100000x10FFFF,设为变量 x
      2. y = x - 0x10000y 的范围是 00xFFFFF
      3. y 前后分为两个 10bit 的十六进制数,y1y2
      4. z1 = 0xD800 + y1z2 = 0xDC00 + y2
      5. z1``z2是所需表示的unicode的编码值

USC-4 和 UTF-32

  • 字节数:四
  • 规则:
    • USC-4
      理论上 00x7FFFFFFF,实际上只有 00x10FFFF
    • UTF-32
      00x10FFFF,算 USC-4 的子集

使用了错误的编码

当对文件使用了非本身的编码来解析,会出现:

  • 乱码
    不同的编码中,相同的字节会映射成不同的字符
  • 文件大小改变
    比如在js中,使用 UTF-8 来读取非 UTF-8 编码的文件,遇到不符合规则的字节,程序尝试解析成一个 UTF-8 的字符,再将数据写入文件,这样一个字节就可能会变成三个字节

参考

2019-2020 shens3