字符集字符编码学习
字符编码这块的知识很重要,从刚入行时的ASCII到现在的Unicode,遇到过很多字符集乱码情况,也都似懂非懂的解决了,但对这些似懂非懂模棱两可的事情总会在心里犯嘀咕,最近终于有时间可以将这块内容好好理一下。
计算机中的字符编码的基本原理就是映射,将给定的字节序依据指定的字符集进行映射输出字符集映射的结果,根据既定的规则完成字节序到特定字符集的映射。
ASCII
ASCII字符集的范围,00000000~01111111(0x00~0x7F),0~127
ASCII字符集被分成4组,每组32个字符组成。
第一组,00000000~0001 1111(0x00~0x1F),控制字符
第二组,00100000~0011 1111(0x20~0x3F),符号、标点、数字
第三组,01000000~0101 1111(0x40~0x5F),符号、大写字母
第四组,01100000~0111 1111(0x60~0x7F),符号、小写字母
(图示1)
(代码1_打印ASII字符集内容_二进制格式)
ISO8859-1
ISO8859-1以ASCII为基础,在空置的0xA0~0xFF增加了96个字符,供附加符号与拉丁字母语言使用。
字符集范围:
0000 0000~0111 1111(0x00~0x7F):标准ASCII字符集
0100 0000~0101 1111(0x80~0x9F):在此字符集下未定义
1010 0000~1111 1111(0xA0~0xFF):ISO8859-1添加的96个字符
ISO/IEC 2022
主要概念
字符集范围
0000 0000~0001 1111(0x00~0x1F):保留给控制字符
0010 0000~01111111(0x20~0x7F):表示图形字符,除去(0x20与0x7F分别表示空格与Del符)两字符后共94个字符。
所以对于双字节的7位编码空间,图形字符可以有94*94=8836个
ISO2022约定字符集分块(针对7位编码)
控制字符分为两块:
- C0,0000 0000 ~ 0001 1111 (0x00~0x1F)
- C1,
打印(图形)字符分四块:
0010 0000~01111 1111(0x20~0x7F)用于G0、G1、G2、G3字符块。
- G0
- G1
- G2
- G3
对于单字节编码的字符集,1个打印(图形)字符块可包含94或96个字符;对于双字节编码的字符集,1个打印(图形)字符块可包含94*94个字符。使用控制符的转义序列来表示在G0、G1、G2、G3之间切换。
ISO2022约定字符集分块(针对8位编码)
8位编码字符集兼容7位编码字符集
控制字符分为两块:
- C0/CL区,0000 0000 ~ 0001 1111 (0x00~0x1F)
- C1/CR区,1000 0000 ~ 1001 1111 (0x80~0x9F)
打印(图形)字符分四块:
- G0/GL区,0010 0000 ~ 0111 1111 (0x20~0x7F)
- G1、G2、G3/GR区,1010 0000 ~ 1111 1111 (0xA0~0xFF)
EUC(Extended Unix Code)
使用8位编码表示字符的标准化方法,主要用于表示及存储文字编码。
EUC基于ISO/IEC 2022的7位编码标准,单字节编码空间为94,双字节编码空间(区位码)为94*94,约定每个区位加上1010 0000(0xA0)用以兼容ISO 2022编码标准。
EUC定义的4个单独的码集:
-
码集0,对应7位依ASCII码为基础的字符集标准,包含ISO2022约定的C0、G0空间的值,范围:
- 0x00~0x7F(0000 0000 ~ 0111 1111)
-
码集1,2,3,对应ISO2022约定的G1空间,其中
- 码集1,表示一些未经修饰的字符
- 码集2,0x8E(1000 1110)为第一字节,属于C1控制字符
- 码集3,0x8F(1000 1111)为第一字节,属于C1控制字符
- 码集0总是单字节编码,码集1编码为1~3字节,码集2、3编码为至少2字节
GB2312
标准简体中文字符集,8位双字节编码。共收录6763个汉字,其中一级汉字3755个,二级汉字3008个,同时收录拉丁字母及其它字母682个字符。
GB2312分区
- 01-09区为符号、数字区
- 16-55区为一级汉字(按拼音排序)
- 56-87区为二级汉字(按部首/笔画排序)
- 10~15区、88~94区未使用
GB2312字节结构
GB2312是单、双字节混合结构
- 字节值在0x00~0x7F为单子节表示一个字符,构成C0,G0区,与ASCII兼容。
汉字及符号以两个字节表示
- 第一个字节(高字节),0xA1~0xF7(01~87区的区号加上0xA0)
- 第二个字节(低字节),0xA1~0xFE(01~94区的区号加上0xA0)
- 因为汉字字符从16区开始,所以汉字区高字节的范围是:0xB0~0xF7(0xB0+16),低字节的范围不变0xA1~0xFE
GB2312字符集范围
- ASCII兼容(0x00~0x7F)
- 中文汉字符号(0xA1A1~0xF7FE)
相关资料
- http://book.51cto.com/art/201202/318141.htm
- http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html