编码学习笔记,资料来源互联网,持续更新
1 ASCII
- American Standard Code for Information Interchange,美国信息交换标准代码。
- 用7位表示128个字符,针对英语设计。
- 0~31、127(33个):控制字符
-
32~126(95个):可显示字符
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 |