基本概念:
二进制:计算机内部使用电平的高低2种状态(01)存储信息,即2进制计数。
字节:计算机的一个存储单位,由8位的01码组成。
ASCII:美国用一个字节表示英语文字符号的一套编码规则。如,78是N。ascii是编码的鼻祖。
1、字符集的构成:字符的集合和编码方式。
字符集合是某种语言里文字、符号、特殊符号的集合。如GB2312包含6700个字符,有些姓名里的生僻字不能显示,于是扩展了范围就是GBK。
编码方式是对这些集合元素编号的方式。如1代表a,2代表b等。可以用你的想法给abc编值;或者给每个汉字编值。
美国的统一编码
为了计算机间交互信息无障碍,美国的科学家首先统一了编码,就是ASCII编码。它是用一个字节,8bit表示一个字符表示美语言里的所有符号。其中1~32以内,是通讯、控制等特殊字符,不可打印的,如空字符、响铃、退格等;33到127包含了符号、数字、字母等所有美国用到的字符。
但是,这是美国标准,不能满足其他国家的需要;如,英国的英镑符号、拉丁语的中音、特别是中国等东亚国家完全不同的文字体系。
英国英语与美国基本相同,只需要扩充个别字符,扩充的字符也在256内,故只需在ascii上进行简单的扩充即可。
由此开始,进行了编码的演变,但根本目的是不变的,用计算机的01表示文字。
扩展到世界
中国汉字数万个,用256个不能完全表示,原来的8bit需要扩充为2个字节,16bit。第一个字节叫高字节,第二个叫低字节。为了与ascii兼容,ascii已占用的编码2个字节都不再占用,如128以内的不用,2个字节转换成值在161~254之间。这就是GB2312,包含了常用的6700个字符和682个中文符号(中文果然复杂!)
但是,后来发现这些还是不够,很多人名字中的生僻字打不出来,还要扩。于是约定,高字节只要>128,就表示和后续的字节一起表示1个汉字;低字节中被ascii占用的161个字符就释放了,于是在原GB2312的基础上,有扩增了近2W个汉字,包含了繁体字。这个是GBK。
世界的统一编码
于是各个国家搞出了类似我们的GB2312、GBK的各自的编码,互相之间不支持。这时ISO组织决定统一标准,重新标志了包括地球上所有文明、所有字母和符号的编码。"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"。
UNICODE与之前的所有区域编码不兼容,没有简单的办法转成GBK或其他,需要查阅编码对照表。
为了在网上传输unicode,又开发UTF(UCS Transfer Format);UTF8就是每次8位传输数据,UTF16是每次16位。
unicode到utf8的转换:为了节省网络带宽和时间,对unicode做了优化,规定:多少编码以内的,用一个字节表示;多少编码以内的,用2个字节表示;多少编码之间的用3位字符表示。英文还是要用1个字节表示;中文都是用3个字节表示,按固定的格式也挺简单的,但意义不明白。