字符编码详解

1. 标准ASCII编码

1.1 编码规范

	由美国国家标准局(ANSI)制定(American Standard Code for Information Interchange,称为ISO 646标准。
采用7位码进行编码,表示128个字符。
最高位(b7)用作奇偶校验位。

2. ANSI编码

中文的ANSI默认是使用gb2312编码。
测试: 在windows建一个txt,保存时选字体格式!

在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。 
当然对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ASNI编码与Unicode编码之间最大也最明显的区别。

3. unicode

3.1 介绍

	Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符。编码从U+0000至U+FFFF。
	比如汉字"经"的编码是0x7ECF,注意字符编码一般用十六进制来表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制就是32463,UCS-2用两个字
节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。
	编码从0到127的字符与ASCII编码的字符一样,比如字母"a"的Unicode编码是0x0061,十进制是97,而"a"的ASCII编码是0x61,十进制也是97, 
对于汉字的编码,事实上Unicode对汉字支持不怎么好,这也是没办法的,  简体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个
,才六万多个,所以Unicode只能排除一些几乎不用的汉字,好在常用的简体汉字也不过七千多个,为了能表示所有汉字,Unicode也有UCS-4规范
,就是用4个字节来编码字符,不过

3.3 实现方式-存储

	一个字符的Unicode编码是确定的。但是在实际传输过程中,以及出于节省空间的目的,不同平台对Unicode编码的实现方式有所不同。
	Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format),简称为UTF。

3.3.1 UTF-8

是unicode的一种实现(存储)方式!
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

3.3.1.1 编码方式

规则很简单,只有二条:
	1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
	2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
	Unicode符号范围 | UTF-8编码方式
		(十六进制) | (二进制)
	--------------------+---------------------------------------------
	0000 0000-0000 007F | 0xxxxxxx
	0000 0080-0000 07FF | 110xxxxx 10xxxxxx
	0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 		(汉字在这个范围中,都是转成3个字节)
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

以汉字“严”为例,演示如何实现UTF-8编码。
	已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),
因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始
,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

4. gb2312

注:因缺少特殊字符,已被GBK和GB18030代替
	GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集--基本集》,
由中国国家标准总局发布,1981年5月1日实施。通行于大陆、新加坡等地。几乎所有的中文系统和国际化的软件都支持GB2312。

	GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日
文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。
	GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖99.75%的使用频率。
对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。

5. GBK

	全名为汉字内码扩展规范(Chinese Internal Code Specification)。K 即是“扩展”所对应的汉语拼音(KuoZhan11)
中“扩”字的声母。GBK 来自中国国家标准代码GB 13000.1-93。 
	GBK 编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode 基本多文种平面中的所有CJK汉字。同 
GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。 GBK还收
录了GB2312不包含的汉字部首符号、竖排标点符号等字符。

6. cp936

cp936即 code page 936(代码页936)是windows以GBK(国标扩展字符集)为基础的编码。

7. GB18030

7.1 简介

GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。
GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。

7.2 编码方式

GB18030编码是变长编码,有单字节、双字节和四字节三种方式。
	GB18030 的单字节编码范围是0X00-0X7F,完全等同与ASCII;
双字节编码的范围和GBK相同,高字节是0X81-0XFE,低字节的编码范围是0X40 -0X7E和0X80-0XFE;
四字节编码中第一、三字节的编码范围是0X81-0XFE,二、四字节是 0X30-0X39。

Windows中CP936代码页使用0X80来表示欧元符号,而在GB18030编码中没有使用0x80编码位,用其他位置来表示欧元符号。这可以理解为是 GB18030向下兼容性上的一点小问题;也可以理解为0X80是CP936对GBK的扩展,而GB18030只是和GBK兼容良好。

8. ISO 8859编码-单字节字符集

8.1 编码规则

ISO8859 不是一个而是一系列的标准,这套字符集与编码系统的共同特色是,以同样的码位对应不同字符集。其基本精神是:
	1.兼容ASCII,所以所有的低位皆不使用。
	2.高位中的前 32 个码位 (0x80 -- 0x9F 或 128--159),保留给扩充定义的 32 个控制码,称为 C1 控制码 (0--31 称为 C0 控制码)。
	3.高位中第 33 个码位 (0xA0 或 160),也就是对应 ASCII 中 SP (空格) 的码位,总是代表 Non-breakable space,也就是不准许折行的空格。
	4.每个字符集定义至多 95 个字符,其码位都在 0xA1 -- 0xFF 或 161--255。
	5.每个字符集收录欧洲某地区的共同常用字符。

8.2 字符集介绍

ISO8859-1 字符集,也就是 Latin-1,是西欧常用字符,包括德法两国的字母。
ISO8859-2 字符集,也称为 Latin-2,收集了东欧字符。
ISO8859-10 字符集,也称为 Latin-6 或 Nordic,收集了北欧 (主要指斯堪地那维亚半岛) 的字符。
原文地址:https://www.cnblogs.com/Desneo/p/7213932.html