

Ansi,GB2312,gbk,unicode,utf8等字符编码的区别
http://blog.163.com/longsu2010@yeah/blog/static/173612348201173115733728/
文件不存在编码,归根结底是二进制文件,用UE打开都是一个个16进制数,只有文件中的字符才可以说是什么编码。
不同字符要通过不同的编码代表来存到文件中,所以就有个编码表,计算机要读取文件中字符需要知道文件中字符编码才能解析出字符
ANSI
最早的计算机是8个晶体管,人们用晶体开合排列表数种,所有一字符定义为了8bit,每个晶体管有开合(0或1)两种状态,共可表示2的8次方256种状态
用前32个状态表表翻页,换行,发声(嘟)等,又用了127个状态空格,英文大小写字母,数字等,
用这个编码来存储的方案就叫ANSI的ASCII编码(American Standard Code for Information Interchange,美国信息互换标准代码)。
后来人们又加入了一些字符,画表格的符号扩展了ASCII表的内容。
GB2312与GBK
由于ASCII不能表示汉字,所有国人发明了GB2312编码,该编码用两个字节表示汉字,如果两个字节同时大于127(7F)计算机就认为这两个字节代表的是汉字,
编码虽然删除了ASCII表127种状态后面的状态表示的内容,但保留了ASCII码表前127种编码表示方法,而且把这127种状态代表的字符又重新定义了一遍,所有这些字符有了半角和全角的区别。
这种方法可表示6000种文字。
由于汉字远多于6000种,所以后面又扩展了GB2312,规定只要一个字节大于127就表这个字节和后面的组合代表汉字。
这种又增加了20000多个汉字,这就是GBK。
其它字符集
相似于BG2312,所以各国为了表示自己的文字就定义相应的字符集,如日,韩,台等都有自己这字符集,像台湾的BIG5
unicode与utf-8
为了解决所有问题最后ISO提出了unicode(Universal Multiple-Octet Coded Character Set,简称 UCS),它把以前ANSI规定1个字符表示的都扩充为两个字符,并且把所有的语言都编码进unicode
规定用两个字节16位来表示一个字符,共可表示2的16次方65536个字符。
由于以前1个字节表示的内容现要2个字节表示,但网络上80%都属于英文。白白占用了大量空间,所以后面又研究出了utf-8
utf-8是把常用字符为单字节表示,把汉字等用双字节表示。8代表每次在网络上传输8位,utf-16表每次在网络传输16位。
unicode还有个字节序的问题,即主机字节序(大头在前)与网络字节序(小头在前),在网络上传输时为通知接收端字节序,
会在每个流前加FFEF表主机字节序,加EFFF网络字节序。
如,如记本用输入“梦之都”,分别存为unicode和unicode big endian两个模式,用UE打开每两个字节查看。
unicode下:FF FE A6 68 4B 4E FD 90
unicode big endian下:FE FF 68 A6 4E 4B 90 FD
注:unicode与gbk两字节编码完全不兼容,它们间的转换是要通过查找表的方式。