字符编码的种类:ASCII、GB2312、GBK、GB18030、Unicode、UTF-8、UTF-16、Base64
ASCII码
ASCII:https://zh.wikipedia.org/wiki/ASCII
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并且已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。起始于50年代后期,在1967年定案,于1986年完成最后一次更新。
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。
标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中最高位用于了奇偶校验。
其中:
0~31及127(共33个)是控制字符或通信专用字符(其余95为可显示字符);
32~126(共95个)是字符(32是空格);
48~57为0到9十个阿拉伯数字;
65~90为26个大写英文字母;
97~122号为26个小写英文字母;
其余为一些标点符号、运算符号等;
由于标准 ASCII 字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了 ISO2022 标准,它规定了在保持与 ISO646 兼容的前提下将 ASCII 字符集扩充为 8 位代码的统一方法。 ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集,每种扩充 ASCII 字符集分别可以扩充 128 个字符,这些扩充字符的编码均为高位为 1 的 8 位代码(即十进制数 128~255 ),称为扩展 ASCII 码(EASCII)。
EASCII
EASCII(Extended ASCII,延伸美国标准信息交换码)是将ASCII码由7位扩充为8位而成。EASCII的内码是由0到255共有256个字符组成。EASCII码比ASCII码扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。
EASCII是互补兼容的,不过都符合ISO2022的标准,即保持与ISO646兼容;
EBCDIC
EBCDIC(Extended Binary Coded Decimal Interchange Code)扩增二进式十进交换码,为IBM于1963年-1964年间推出的字符编码表,根据早期打孔机式的二进化十进数(BCD,Bindary Coded Decimal)排列而成。是IBM迷尔级以上电脑的标准码。
EBCDIC也是单字节编码系统,每个字母或数字字符都被表示为一个8位的二进制数(一个0、1字符串),256个可能的字符被定义(字母,数字和一些特殊字符)。
它的缺点是:英文字母不是连续地排列,中间出现多次断续,为撰写程序的人带来了一些困难。
注:EBCDIC是IBM为她大型操作系统开发的,IBM个人计算机和工作站系统仍然使用ASCII;
无论是ASCII码还是EBCDIC码,都无法对拥有几万个的汉字进行编码。
GB2312
https://zh.wikipedia.org/wiki/GB_2312
GB2312 -《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980,又称为 GB 2312–80、GB0。
GB2312编码用两个字节(8位2进制)表示一个汉字,所以理论上最多可以表示256×256=65536个汉字。
整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。
基本集共收入汉字6763个和非汉字图形字符682个。它所收录的汉字已经覆盖中国大陆99.75%的使用频率。但对于人名、古汉语等方面出现的罕用字和繁体字,GB 2312不能处理,因此后来GBK及GB 18030汉字字符集相继出现以解决这些问题。
GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。
GBK
https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97%E5%86%85%E7%A0%81%E6%89%A9%E5%B1%95%E8%A7%84%E8%8C%83
GBK,汉字内码扩展规范,全名为《汉字内码扩展规范(GBK)》1.0版,由中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订。
GBK的K为汉语拼音Kuo Zhan(扩展)中“扩”字的声母。英文全称Chinese Internal Code Extension Specification。
GBK 只为“技术规范指导性文件”,不属于国家标准。国家质量技术监督局于2000年3月17日推出了GB 18030-2000标准,以取代GBK。
GB18030
https://zh.wikipedia.org/wiki/GB_18030
GB 18030,全称:国家标准GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》的修订版。
与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70,244个。
GB 18030主要有以下特点:
与 UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。
编码空间庞大,最多可定义161万个字元。
支持中国国内少数民族的文字,不需要动用造字区。
汉字收录范围包含繁体汉字以及日韩汉字。
Unicode
http://unicode.org/
https://zh.wikipedia.org/wiki/Unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。
Unicode备受认可,并广泛地应用于电脑软件的国际化与本地化过程。有很多新科技,如可扩展置标语言、Java编程语言以及现代的操作系统,都采用Unicode编码。
虽然Unicode统一了编码方式,但是它的效率不高,
比如UCS-4,用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
UTF-8
https://zh.wikipedia.org/wiki/UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码(UTF-8可以根据不同的符号自动选择编码的长短),又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。
128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
其他极少使用的Unicode 辅助平面的字符使用四字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节)。
UTF-16
https://zh.wikipedia.org/wiki/UTF-16
UTF-16是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为 "storage format")的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。
UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。
UTF-32
https://zh.wikipedia.org/wiki/UTF-32
UTF-32 (或 UCS-4)是一种将Unicode字符编码的协议,对每一个Unicode码位使用恰好32比特。UTF 只有此一种定长编码。
UTF-32 使用32-比特的码值,只在0到10FFFF的字码空间(百万个码位)。
UTF-32 原本是一个 UCS-4 的子集,于是就现状而言,除了 UTF-32 标准包含额外的 Unicode 意涵,UCS-4 和 UTF-32 大体是相同的。
Base64
https://zh.wikipedia.org/wiki/Base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。
在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
完整的base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的4/3。
转换过程:
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲器中剩下的bit用0补足。然后,每次取出6(因为26=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
当原数据长度不是3的整数倍时, 如果最后剩下一个输入数据,在编码结果后加2个“=”;如果最后剩下两个输入数据,编码结果后加1个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。
(如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个'='号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表:)
Base64编码的作用:
由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。它使用下面表中所使用的字符与编码。
比如:GB2312-根据Base64规则->转换成ASCII码,
接收端收到ASCII码-根据Base64规则->还原到GB2312
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。而且base64特别适合在http,mime协议下快速传输数据。
编年史:
先是ASCII编码,使用一个字节的7位来表示128个字符(大小写字母,数字0到9、标点符号、及在美式英语中使用的特殊控制字符);
表示的字符实在太少,出现了EASCII,EASCII码比ASCII码扩充出来的128符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号;
太小家子气了,中国使用两个字节扩充了ASCII,称之为GB2312,支持汉字6763个和非汉字图形字符682个;
罕用字和繁体字GB2312处理不过来,GBK及GB 18030汉字字符集相继出现以解决这个问题;
IOS看不下去了,制定了专为解决传统的字符编码方案的局限性的Unicode;
为了节约传输消耗和存储空间,UTF-8和UTF-16应运而生;
Base64主要是为了解决有些系统只能使用ASCII的尴尬,本身比较适合处理文本数据的传输和存储;
encodeUriComponent:
encodeUriComponent,encodeUri 它是将中文、韩文等特殊字符转换成utf-8格式的url编码
字节序:Little-Endian Big-Endian
就是大于一个字节类型的数据在内存中的存放顺序
posted on 2016-07-18 15:05 alvin.zhang 阅读(1459) 评论(0) 编辑 收藏 举报