字符集与字符编码

1. 字符集与字符编码

参考:

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
  • 字节顺序模式:
    • 大端模式(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)56880P104h
33!57981Q105i
34"58:82R106j
35#59;83S107k
36$60<84T108l
37%61=85U109m
38&62>86V110n
3963?87W111o
40(64@88X112p
41)65A89Y113q
42*66B90Z114r
43+67C91[115s
44,68D92\116t
45-69E93]117u
46.70F94^118v
47/71G95_119w
48072H96`120x
49173I97a121y
50274J98b122z
51375K99c123{
52476L100d124|
53577M101e125}
54678N102f126~
55779O103g127DEL

1.4.2 ASCII码对照表(完整版)

二进制八进制十进制十六进制缩写/字符解释
0000 00000000x00NUL(null)空字符
0000 00010110x01SOH(start of headline)标题开始
0000 00100220x02STX (start of text)正文开始
0000 00110330x03ETX (end of text)正文结束
0000 01000440x04EOT (end of transmission)传输结束
0000 01010550x05ENQ (enquiry)请求
0000 01100660x06ACK (acknowledge)收到通知
0000 01110770x07BEL (bell)响铃
0000 100001080x08BS (backspace)退格
0000 100101190x09HT (horizontal tab)水平制表符
0000 1010012100x0ALF (NL line feed, new line)换行键
0000 1011013110x0BVT (vertical tab)垂直制表符
0000 1100014120x0CFF (NP form feed, new page)换页键
0000 1101015130x0DCR (carriage return)回车键
0000 1110016140x0ESO (shift out)不用切换
0000 1111017150x0FSI (shift in)启用切换
0001 0000020160x10DLE (data link escape)数据链路转义
0001 0001021170x11DC1 (device control 1)设备控制1
0001 0010022180x12DC2 (device control 2)设备控制2
0001 0011023190x13DC3 (device control 3)设备控制3
0001 0100024200x14DC4 (device control 4)设备控制4
0001 0101025210x15NAK (negative acknowledge)拒绝接收
0001 0110026220x16SYN (synchronous idle)同步空闲
0001 0111027230x17ETB (end of trans. block)结束传输块
0001 1000030240x18CAN (cancel)取消
0001 1001031250x19EM (end of medium)媒介结束
0001 1010032260x1ASUB (substitute)代替
0001 1011033270x1BESC (escape)换码(溢出)
0001 1100034280x1CFS (file separator)文件分隔符
0001 1101035290x1DGS (group separator)分组符
0001 1110036300x1ERS (record separator)记录分隔符
0001 1111037310x1FUS (unit separator)单元分隔符
0010 0000040320x20(space)空格
0010 0001041330x21!叹号
0010 0010042340x22"双引号
0010 0011043350x23#井号
0010 0100044360x24$美元符
0010 0101045370x25%百分号
0010 0110046380x26&和号
0010 0111047390x27闭单引号
0010 1000050400x28(开括号
0010 1001051410x29)闭括号
0010 1010052420x2A*星号
0010 1011053430x2B+加号
0010 1100054440x2C,逗号
0010 1101055450x2D-减号/破折号
0010 1110056460x2E.句号
0010 1111057470x2F/斜杠
0011 0000060480x300字符0
0011 0001061490x311字符1
0011 0010062500x322字符2
0011 0011063510x333字符3
0011 0100064520x344字符4
0011 0101065530x355字符5
0011 0110066540x366字符6
0011 0111067550x377字符7
0011 1000070560x388字符8
0011 1001071570x399字符9
0011 1010072580x3A:冒号
0011 1011073590x3B;分号
0011 1100074600x3C<小于
0011 1101075610x3D=等号
0011 1110076620x3E>大于
0011 1111077630x3F?问号
0100 00000100640x40@电子邮件符号
0100 00010101650x41A大写字母A
0100 00100102660x42B大写字母B
0100 00110103670x43C大写字母C
0100 01000104680x44D大写字母D
0100 01010105690x45E大写字母E
0100 01100106700x46F大写字母F
0100 01110107710x47G大写字母G
0100 10000110720x48H大写字母H
0100 10010111730x49I大写字母I
010010100112740x4AJ大写字母J
0100 10110113750x4BK大写字母K
0100 11000114760x4CL大写字母L
0100 11010115770x4DM大写字母M
0100 11100116780x4EN大写字母N
0100 11110117790x4FO大写字母O
0101 00000120800x50P大写字母P
0101 00010121810x51Q大写字母Q
0101 00100122820x52R大写字母R
0101 00110123830x53S大写字母S
0101 01000124840x54T大写字母T
0101 01010125850x55U大写字母U
0101 01100126860x56V大写字母V
0101 01110127870x57W大写字母W
0101 10000130880x58X大写字母X
0101 10010131890x59Y大写字母Y
0101 10100132900x5AZ大写字母Z
0101 10110133910x5B[开方括号
0101 11000134920x5C\反斜杠
0101 11010135930x5D]闭方括号
0101 11100136940x5E^脱字符
0101 11110137950x5F_下划线
0110 00000140960x60`开单引号
0110 00010141970x61a小写字母a
0110 00100142980x62b小写字母b
0110 00110143990x63c小写字母c
0110 010001441000x64d小写字母d
0110 010101451010x65e小写字母e
0110 011001461020x66f小写字母f
0110 011101471030x67g小写字母g
0110 100001501040x68h小写字母h
0110 100101511050x69i小写字母i
0110 101001521060x6Aj小写字母j
0110 101101531070x6Bk小写字母k
0110 110001541080x6Cl小写字母l
0110 110101551090x6Dm小写字母m
0110 111001561100x6En小写字母n
0110 111101571110x6Fo小写字母o
0111 000001601120x70p小写字母p
0111 000101611130x71q小写字母q
0111 001001621140x72r小写字母r
0111 001101631150x73s小写字母s
0111 010001641160x74t小写字母t
0111 010101651170x75u小写字母u
0111 011001661180x76v小写字母v
0111 011101671190x77w小写字母w
0111 100001701200x78x小写字母x
0111 100101711210x79y小写字母y
0111 101001721220x7Az小写字母z
0111 101101731230x7B{开花括号
0111 110001741240x7C|垂线
0111 110101751250x7D}闭花括号
0111 111001761260x7E~波浪号
0111 111101771270x7FDEL (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” 。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值