1. 字符集与字符编码
参考:
- 字符集和URL的编码与解码
- 字符集和字符编码(Charset & Encoding)
- 全网最全面、全详细的编码、解码知识!!!
- 字符编码的概念(UTF-8、UTF-16、UTF-32都是什么鬼)
- 大端与小端字节数据详解
1.1 编码基础知识
1.1.1 编码 & 解码
计算机只认识0和1组成的二进制序列,因此任何文件中的内容要想被计算机识别或者想存储在计算机上都需要转换为二进制序列。
- 编码:将字符转换为对应的二进制序列
- 解码:将二进制序列转换为对应的字符
1.1.2 字符集 & 字符编码
- 字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括文字、标点符号、图形符号、数字等。
- 字符编码(Character Encoding):在符号集合与数字系统之间建立对应关系,将符号转换为计算机可以处理的数字系统的数字。字符编码分为两大类:
- 非Unicode编码
- 西文编码:ASCII、ISO8859-1、Windows-1252
- 中文编码:GB2312、GBK、GB18030、Big5
- Unicode编码
- UTF-8、UTF-16、UTF-32
- 非Unicode编码
- 字节顺序模式:
- 大端模式(Big Endian,BE):按照从低地址到高地址的顺序存放数据的高位字节到低位字节
- 小端模式(Little Endian,LE):按照从低地址到高地址的顺序存放据的低位字节到高位字节
字符集和字符编码的关系:
- 区别:
- 字符集:定义了文字和二进制的对应关系,为字符分配了唯一的编号
- 字符编码:规定了如何将文字的编号存储到内存中。
- 联系:
- 通常特定的字符集采用特定的编码方式,即一种字符集对应一种字符编码,如: ASCII、ISO8859-1、Windows-1252、GB2312、GBK、GB18030、Big5都是既表示了字符集又表示了对应的字符编码。
- 但Unicode字符集是特例,只制定字符的编号,而没有指定编码格式,Unicode字符集对应的字符编码有:UTF-8、UTF-16、UTF-32
1.2 非Unicode编码
1.2.1 西文编码
1、ASCII
- 用途:全称是American Standard Code for Information Interchange,即美国信息交换标准代码,主要用于显示英语,包括26个英文字母、英文标点符号和阿拉伯数字。
- 编码规则:单字节编码,最多可以表示2**8=256个字符。实际上ASCII码表中只有128个字符,故最高位无需使用,全都为0。
2、ISO8859-1
- 用途:又称Latin-1,在ASCII编码之上增加了西欧语言的文字符号。
- 编码规则:单字节编码,其中0127与ASCII码一样,128255规定了不同的含义。
3、Windows-1252
- 用途:在ISO8859-1编码之上增加了一些其他常用的字符。基本上可以认为,ISO8859-1已被Windows-1252取代,在很多应用程序中,即使文件声明它采用的是ISO8859-1编码,解析的时候依然被当作Windows-1252编码。HTML5甚至明确规定,如果文件声明的是ISO8859-1编码,它应该被看作Windows-1252编码。
- 编码规则:与ISO8859-1基本是一样的,区别只在于数字128~159
各个国家发明了各种各样编码方式以表示自己国家的字符,为了保持与ASCII码的兼容性,一般都是将最高位设置为1。也就是说,当最高位为0时,表示ASCII码,当最高位为为1时,表示各个国家自己的字符。
1.2.2 中文编码
1、GB2312
- 用途:主要针对的是简体中文常见字符,包括约7000个汉字
- 编码规则:使用双字节编码,在这两个字节中,最高位都是1,如果是0,就认为是ASCII字符。
2、GBK
- 用途:GB2312的扩展,包括约21000个汉字,含繁体字。GBK由微软首先制定的,最早实现于Windows 95简体中文版,并不属于国家标准。
- 编码规则:在兼容GB2312和ASCII的前提下,用双字节编码又编码了许多汉字。
3、GB18030
- 用途:GBK的扩展,共收录汉字70000多个,增加了少数民族的文字和日韩汉字
- 编码规则:两字节满足不了需求,使用变长编码,有的字符是两个字节,有的是四个字节。
4、Big5
- 用途:又称大五码,针对繁体中文的,包括13000多个繁体字,广泛用于中国台湾和中国香港。
- 编码规则:和GB2312类似,使用双字节编码
注意:GBK使用双字节编码,高位字节的最高位不能为0,低位字节的最高位可能为0,在解析二进制流的时候,如果第一个字节的最高位为1,那么就将下一个字节读进来一起解析为一个汉字,而不用考虑它的最高位,解析完后,跳到第三个字节继续解析。
1.3 Unicode编码
1.3.1 Unicode字符集
- 传统的字符编码方案的局限性:各地人们通过网络与其他的地区进行交流时,因为各地的编码标准都不一样,就会在转换中出现‘’乱码‘’现象。为了解决这个问题,Unicode字符集应运而生。
- Unicode:
- 概念:也称为统一码、万国码。Unicode编码系统为表达任意语言的任意字符而设计,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
- 特点:是一个独立的字符集,它并不是和编码绑定的。简单说,就是给所有字符分配了唯一数字编号,但并没有规定这个编号怎么对应到二进制表示。
1.3.2 Unicode编码
Unicode编码:
- UFT-8:变长编码,使用 1~4 个字节来存储,英文字符用1个字节保存,中文字符用3个字节保存。最节约存储空间。
- UTF-16:变长编码,使用 2 个或者 4 个字节来存储,常用的字符使用2个字节表示,不常用的字符使用4个字节表示。比 UTF-32 节省存储空间。
- UFT-32:定长编码,使用 4 个字节来存储,非常浪费存储空间。
对比:
-
是否兼容ASCII:
- UTF-8 兼容 ASCII
- UTF-32 和 UTF-16 都不兼容 ASCII,因为它们没有单字节编码。
-
字节序问题:
- UTF-8 不存在字节序问题
- UTF-16 和 UTF-32 存在字节序问题,UTF-16 大端模式的编码叫 UTF-16BE,小端模式编码叫 UTF-16LE。UTF-32与之类似。为了标明文档的字节序,UTF-16 定义了一个字节顺序标记 U+FEFF。如果收到一个以字节 FFFE 开头的UTF-16编码的文档,则是大端模式。
1.3.3 UTF-8
上面三种编码规则中,UTF-8 兼容ASCII码,使用最为广泛。
UTF-8 的编码规则:
-
如果只有一个字节,那么最高的比特位为 0;
-
如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。
具体的表现形式为:
- 0xxxxxxx:单字节编码形式,和 ASCII 编码完全一样,因此 UTF-8 是兼容 ASCII 的;
- 110xxxxx 10xxxxxx:双字节编码形式;
- 1110xxxx 10xxxxxx 10xxxxxx:三字节编码形式;
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字节编码形式。
1.4 附录:ASCII码表
1.4.1 ASCII码对照表(简略版)
十进制 | 字符 | 十进制 | 字符 | 十进制 | 字符 | 十进制 | 字符 | |||
---|---|---|---|---|---|---|---|---|---|---|
32 | (space) | 56 | 8 | 80 | P | 104 | h | |||
33 | ! | 57 | 9 | 81 | Q | 105 | i | |||
34 | " | 58 | : | 82 | R | 106 | j | |||
35 | # | 59 | ; | 83 | S | 107 | k | |||
36 | $ | 60 | < | 84 | T | 108 | l | |||
37 | % | 61 | = | 85 | U | 109 | m | |||
38 | & | 62 | > | 86 | V | 110 | n | |||
39 | ’ | 63 | ? | 87 | W | 111 | o | |||
40 | ( | 64 | @ | 88 | X | 112 | p | |||
41 | ) | 65 | A | 89 | Y | 113 | q | |||
42 | * | 66 | B | 90 | Z | 114 | r | |||
43 | + | 67 | C | 91 | [ | 115 | s | |||
44 | , | 68 | D | 92 | \ | 116 | t | |||
45 | - | 69 | E | 93 | ] | 117 | u | |||
46 | . | 70 | F | 94 | ^ | 118 | v | |||
47 | / | 71 | G | 95 | _ | 119 | w | |||
48 | 0 | 72 | H | 96 | ` | 120 | x | |||
49 | 1 | 73 | I | 97 | a | 121 | y | |||
50 | 2 | 74 | J | 98 | b | 122 | z | |||
51 | 3 | 75 | K | 99 | c | 123 | { | |||
52 | 4 | 76 | L | 100 | d | 124 | | | |||
53 | 5 | 77 | M | 101 | e | 125 | } | |||
54 | 6 | 78 | N | 102 | f | 126 | ~ | |||
55 | 7 | 79 | O | 103 | g | 127 | DEL |
1.4.2 ASCII码对照表(完整版)
二进制 | 八进制 | 十进制 | 十六进制 | 缩写/字符 | 解释 |
---|---|---|---|---|---|
0000 0000 | 00 | 0 | 0x00 | NUL(null) | 空字符 |
0000 0001 | 01 | 1 | 0x01 | SOH(start of headline) | 标题开始 |
0000 0010 | 02 | 2 | 0x02 | STX (start of text) | 正文开始 |
0000 0011 | 03 | 3 | 0x03 | ETX (end of text) | 正文结束 |
0000 0100 | 04 | 4 | 0x04 | EOT (end of transmission) | 传输结束 |
0000 0101 | 05 | 5 | 0x05 | ENQ (enquiry) | 请求 |
0000 0110 | 06 | 6 | 0x06 | ACK (acknowledge) | 收到通知 |
0000 0111 | 07 | 7 | 0x07 | BEL (bell) | 响铃 |
0000 1000 | 010 | 8 | 0x08 | BS (backspace) | 退格 |
0000 1001 | 011 | 9 | 0x09 | HT (horizontal tab) | 水平制表符 |
0000 1010 | 012 | 10 | 0x0A | LF (NL line feed, new line) | 换行键 |
0000 1011 | 013 | 11 | 0x0B | VT (vertical tab) | 垂直制表符 |
0000 1100 | 014 | 12 | 0x0C | FF (NP form feed, new page) | 换页键 |
0000 1101 | 015 | 13 | 0x0D | CR (carriage return) | 回车键 |
0000 1110 | 016 | 14 | 0x0E | SO (shift out) | 不用切换 |
0000 1111 | 017 | 15 | 0x0F | SI (shift in) | 启用切换 |
0001 0000 | 020 | 16 | 0x10 | DLE (data link escape) | 数据链路转义 |
0001 0001 | 021 | 17 | 0x11 | DC1 (device control 1) | 设备控制1 |
0001 0010 | 022 | 18 | 0x12 | DC2 (device control 2) | 设备控制2 |
0001 0011 | 023 | 19 | 0x13 | DC3 (device control 3) | 设备控制3 |
0001 0100 | 024 | 20 | 0x14 | DC4 (device control 4) | 设备控制4 |
0001 0101 | 025 | 21 | 0x15 | NAK (negative acknowledge) | 拒绝接收 |
0001 0110 | 026 | 22 | 0x16 | SYN (synchronous idle) | 同步空闲 |
0001 0111 | 027 | 23 | 0x17 | ETB (end of trans. block) | 结束传输块 |
0001 1000 | 030 | 24 | 0x18 | CAN (cancel) | 取消 |
0001 1001 | 031 | 25 | 0x19 | EM (end of medium) | 媒介结束 |
0001 1010 | 032 | 26 | 0x1A | SUB (substitute) | 代替 |
0001 1011 | 033 | 27 | 0x1B | ESC (escape) | 换码(溢出) |
0001 1100 | 034 | 28 | 0x1C | FS (file separator) | 文件分隔符 |
0001 1101 | 035 | 29 | 0x1D | GS (group separator) | 分组符 |
0001 1110 | 036 | 30 | 0x1E | RS (record separator) | 记录分隔符 |
0001 1111 | 037 | 31 | 0x1F | US (unit separator) | 单元分隔符 |
0010 0000 | 040 | 32 | 0x20 | (space) | 空格 |
0010 0001 | 041 | 33 | 0x21 | ! | 叹号 |
0010 0010 | 042 | 34 | 0x22 | " | 双引号 |
0010 0011 | 043 | 35 | 0x23 | # | 井号 |
0010 0100 | 044 | 36 | 0x24 | $ | 美元符 |
0010 0101 | 045 | 37 | 0x25 | % | 百分号 |
0010 0110 | 046 | 38 | 0x26 | & | 和号 |
0010 0111 | 047 | 39 | 0x27 | ’ | 闭单引号 |
0010 1000 | 050 | 40 | 0x28 | ( | 开括号 |
0010 1001 | 051 | 41 | 0x29 | ) | 闭括号 |
0010 1010 | 052 | 42 | 0x2A | * | 星号 |
0010 1011 | 053 | 43 | 0x2B | + | 加号 |
0010 1100 | 054 | 44 | 0x2C | , | 逗号 |
0010 1101 | 055 | 45 | 0x2D | - | 减号/破折号 |
0010 1110 | 056 | 46 | 0x2E | . | 句号 |
0010 1111 | 057 | 47 | 0x2F | / | 斜杠 |
0011 0000 | 060 | 48 | 0x30 | 0 | 字符0 |
0011 0001 | 061 | 49 | 0x31 | 1 | 字符1 |
0011 0010 | 062 | 50 | 0x32 | 2 | 字符2 |
0011 0011 | 063 | 51 | 0x33 | 3 | 字符3 |
0011 0100 | 064 | 52 | 0x34 | 4 | 字符4 |
0011 0101 | 065 | 53 | 0x35 | 5 | 字符5 |
0011 0110 | 066 | 54 | 0x36 | 6 | 字符6 |
0011 0111 | 067 | 55 | 0x37 | 7 | 字符7 |
0011 1000 | 070 | 56 | 0x38 | 8 | 字符8 |
0011 1001 | 071 | 57 | 0x39 | 9 | 字符9 |
0011 1010 | 072 | 58 | 0x3A | : | 冒号 |
0011 1011 | 073 | 59 | 0x3B | ; | 分号 |
0011 1100 | 074 | 60 | 0x3C | < | 小于 |
0011 1101 | 075 | 61 | 0x3D | = | 等号 |
0011 1110 | 076 | 62 | 0x3E | > | 大于 |
0011 1111 | 077 | 63 | 0x3F | ? | 问号 |
0100 0000 | 0100 | 64 | 0x40 | @ | 电子邮件符号 |
0100 0001 | 0101 | 65 | 0x41 | A | 大写字母A |
0100 0010 | 0102 | 66 | 0x42 | B | 大写字母B |
0100 0011 | 0103 | 67 | 0x43 | C | 大写字母C |
0100 0100 | 0104 | 68 | 0x44 | D | 大写字母D |
0100 0101 | 0105 | 69 | 0x45 | E | 大写字母E |
0100 0110 | 0106 | 70 | 0x46 | F | 大写字母F |
0100 0111 | 0107 | 71 | 0x47 | G | 大写字母G |
0100 1000 | 0110 | 72 | 0x48 | H | 大写字母H |
0100 1001 | 0111 | 73 | 0x49 | I | 大写字母I |
01001010 | 0112 | 74 | 0x4A | J | 大写字母J |
0100 1011 | 0113 | 75 | 0x4B | K | 大写字母K |
0100 1100 | 0114 | 76 | 0x4C | L | 大写字母L |
0100 1101 | 0115 | 77 | 0x4D | M | 大写字母M |
0100 1110 | 0116 | 78 | 0x4E | N | 大写字母N |
0100 1111 | 0117 | 79 | 0x4F | O | 大写字母O |
0101 0000 | 0120 | 80 | 0x50 | P | 大写字母P |
0101 0001 | 0121 | 81 | 0x51 | Q | 大写字母Q |
0101 0010 | 0122 | 82 | 0x52 | R | 大写字母R |
0101 0011 | 0123 | 83 | 0x53 | S | 大写字母S |
0101 0100 | 0124 | 84 | 0x54 | T | 大写字母T |
0101 0101 | 0125 | 85 | 0x55 | U | 大写字母U |
0101 0110 | 0126 | 86 | 0x56 | V | 大写字母V |
0101 0111 | 0127 | 87 | 0x57 | W | 大写字母W |
0101 1000 | 0130 | 88 | 0x58 | X | 大写字母X |
0101 1001 | 0131 | 89 | 0x59 | Y | 大写字母Y |
0101 1010 | 0132 | 90 | 0x5A | Z | 大写字母Z |
0101 1011 | 0133 | 91 | 0x5B | [ | 开方括号 |
0101 1100 | 0134 | 92 | 0x5C | \ | 反斜杠 |
0101 1101 | 0135 | 93 | 0x5D | ] | 闭方括号 |
0101 1110 | 0136 | 94 | 0x5E | ^ | 脱字符 |
0101 1111 | 0137 | 95 | 0x5F | _ | 下划线 |
0110 0000 | 0140 | 96 | 0x60 | ` | 开单引号 |
0110 0001 | 0141 | 97 | 0x61 | a | 小写字母a |
0110 0010 | 0142 | 98 | 0x62 | b | 小写字母b |
0110 0011 | 0143 | 99 | 0x63 | c | 小写字母c |
0110 0100 | 0144 | 100 | 0x64 | d | 小写字母d |
0110 0101 | 0145 | 101 | 0x65 | e | 小写字母e |
0110 0110 | 0146 | 102 | 0x66 | f | 小写字母f |
0110 0111 | 0147 | 103 | 0x67 | g | 小写字母g |
0110 1000 | 0150 | 104 | 0x68 | h | 小写字母h |
0110 1001 | 0151 | 105 | 0x69 | i | 小写字母i |
0110 1010 | 0152 | 106 | 0x6A | j | 小写字母j |
0110 1011 | 0153 | 107 | 0x6B | k | 小写字母k |
0110 1100 | 0154 | 108 | 0x6C | l | 小写字母l |
0110 1101 | 0155 | 109 | 0x6D | m | 小写字母m |
0110 1110 | 0156 | 110 | 0x6E | n | 小写字母n |
0110 1111 | 0157 | 111 | 0x6F | o | 小写字母o |
0111 0000 | 0160 | 112 | 0x70 | p | 小写字母p |
0111 0001 | 0161 | 113 | 0x71 | q | 小写字母q |
0111 0010 | 0162 | 114 | 0x72 | r | 小写字母r |
0111 0011 | 0163 | 115 | 0x73 | s | 小写字母s |
0111 0100 | 0164 | 116 | 0x74 | t | 小写字母t |
0111 0101 | 0165 | 117 | 0x75 | u | 小写字母u |
0111 0110 | 0166 | 118 | 0x76 | v | 小写字母v |
0111 0111 | 0167 | 119 | 0x77 | w | 小写字母w |
0111 1000 | 0170 | 120 | 0x78 | x | 小写字母x |
0111 1001 | 0171 | 121 | 0x79 | y | 小写字母y |
0111 1010 | 0172 | 122 | 0x7A | z | 小写字母z |
0111 1011 | 0173 | 123 | 0x7B | { | 开花括号 |
0111 1100 | 0174 | 124 | 0x7C | | | 垂线 |
0111 1101 | 0175 | 125 | 0x7D | } | 闭花括号 |
0111 1110 | 0176 | 126 | 0x7E | ~ | 波浪号 |
0111 1111 | 0177 | 127 | 0x7F | DEL (delete) | 删除 |
1.4.3 说明
常见ASCII码的大小规则:0~9 < A~Z < a~z。
1)数字比字母要小。如 “7” < “F”;
2)数字0比数字9要小,并按0到9顺序递增。如 “3” < “8” ;
3)字母A比字母Z要小,并按A到Z顺序递增。如 “A” < “Z” ;
3)字母a比字母z要小,并按a到z顺序递增。如 “a” < “z” ;
4)同个字母的大写字母比小写字母要小32。如 “A” < “a” 。