【编码】ASCII、ISO 8859-1、Unicode(UTF-8/16/32)

编码学习笔记,资料来源互联网,持续更新

1 ASCII

  • American Standard Code for Information Interchange,美国信息交换标准代码。
  • 用7位表示128个字符,针对英语设计。
  1. 0~31、127(33个):控制字符
  2. 32~126(95个):可显示字符


    ASCII码对应表

2 ISO 8859-1

用8位表示256个字符

3 Unicode

  很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。
  Unicode(统一码、万国码、单一码)是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

3.1 编码

  目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。在第0平面中,中文范围是0x4E00-0x9FA5。

3.2 UTF

  对可以用ASCII表示的字符使用Unicode并不高效,因为Unicode比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Unicode Transformation Format)。常见的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16以及UTF-32。

  在Unicode中,“汉字”两个字对应的十六进制是分别是0x6c49和0x5b57,通过编码:

char      data_utf8[]={0xE6,0xB2,0x94,0xE5,0xAD,0x97};//UTF-8编码
char16_t data_utf16[]={0x6C49,0x5B57};                //UTF-16编码
char32_t data_utf32[]={0x00006C49,0x00005B57};        //UTF-32编码

  这里用char、char16_t、char32_t分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以char、char16_t、char32_t作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要4个字节。“汉字”的UTF-32编码8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
  下面分别介绍UTF-8/16/32如何编码。

3.2.1 UTF-8

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

Unicode/UCS-4 bit数 UTF-8 byte数
0000~ 007F 0~7 0XXX XXXX 1
0080~ 07FF 8~11 110X XXXX
10XX XXXX
2
0800~ FFFF 12~16 1110 XXXX
10XX XXXX
10XX XXXX
3
1 0000~ 1F FFFF 17~21 1111 0XXX
10XX XXXX
10XX XXXX
10XX XXXX
4
3.2.2 UTF-16
3.2.3 UTF-32

Reference:

  1. 百度百科-UTF-8
  2. 百度百科-Unicode

你可能感兴趣的:(【编码】ASCII、ISO 8859-1、Unicode(UTF-8/16/32))