一.ANSI
-
这里,我将ANSI作为一个大项。根据我自己的理解,ANSI并不是一种具体的编码,而是一种字符代码。比如:ASCII、GB2312、GBK、GB18030等都属于ANSI的范畴。不过这样说也不准确,根据我查阅的资料来看,ASCII是早于ANSI的,所以只能说ANSI是兼容ASCII的,而不能说ASCII是根据ANSI编码所得。
-
ASCII,他的全称为American Standard Code for Information Interchange,美国信息交换标准代码。要知道,一个字节为8位,而8位最多可以组合256种不同的状态,用来保存英文、数字、符号完全够用了,而事实上,ASCII只用了前128个字符。但是后来除了美国,其他的一些国家也使用了计算机,但是他们的文字并非都是这些字母,所以又使用了后面的128位,又叫:”扩展字符集“。
-
MBCS:就目前我查阅的资料来看,MBCS是一种统称,许多汉字的编码都属于MBCS,比如GB2312、GBK、GB18030等。因为无论ASCII编码如何扩展,也满足不了中文,中文的字数太庞大了。MBCS支持中英文混用,英文的话就和ASCII一样,中文的话就占2个字节,GB2312的字数最少,其规定必须2个字节都大于127才表示一个汉字;其次是GBK,其规定只要第一个字节大于127就可以了;最后是GB18030,具体编码不清楚,好像不止2个字节,但应该是兼容GBK的,字数比前面2个要多的多。
-
现在,再来看ANSI,叫美国国家标准协会,顾名思义是用来定义世界编码方式的,不像ASCII,当初创建的时候只是想给美国人自己用而已。ANSI的规则是,ASCII不能动,也就是说所有的ANSI标准都是兼容英文的,比如中文的GBK编码就可以实现中文和英文混用。但是,每个国家自己的文字编码就各不相同了,比如中文的ANSI编码和日本的ANSI编码就完全不同,所以无法实现中文和日文的混用。另外,只要你的编码被ANSI认可,以后世界上任何地方只要使用中文,就必须用中国的这一套编码方案。
二.Unicode
-
根据网上查询的资料来看,有的说Unicode是一种符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,并不是一种编码方式。但是我们常用的TXT文档中,明显就有一种Unicode编码格式,这是为什么呢?
-
从我目前查阅的资料来看,Unicode确实是一种符号集,可以简写为UCS(Unicode Character Set)。但是,Unicode也是有他自己的编码格式的,比如UCS-2就是用两个字节编码、UCS-4用4个字节编码。那么,TXT文档中的Unicode是什么呢?其实就是UCS-2,并且是小端模式。
当然,以上都是我查阅资料所获取的,如果不对,麻烦告知。
-
所以,Unicode将全世界所有的文字等都进行了统一的编码,这样就不会有ANSI的兼容问题。
-
但是Unicode一直得不到推广。因为英文只占一个字节,但是在Unicode却要占2个字节,有很大的浪费;另外,又如何去区分Unicode和ANSII呢,计算机如何知道3个字节到底是一个字符,还是3个字符呢?
-
直到互联网的出现,推动了Unicode的推广。因为,互联网拉近了人和人之间的距离。那么如果用ANSI的话,编码格式太乱了。而UTF标准就出现了,其中UTF-8就是在互联网上使用最广的一种unicode的实现方式,因为他是变长的,所以极大的节省了空间,这种为传输而出现的编码格式,使得全世界的编码方式统一,非常的便利。
这里记录下:java是双字节编码,采用的是UTF-16BE,中文占2个字节,英文占2个字节
三.URL编码
-
url编码是一种浏览器用来打包表单输入的格式,其基本格式为"key=value"这种键值对的,如果要传多个参数就需要用“&”符号对键值对进行分割。
-
URL编码其实使用的是ascii码的16进制,所以,URL中只能有英文、数字还有一些特殊字符。
-
那我们在访问网址的时候,有时候确实后面的参数有中文。这时候,就使用了encode编码,将中文写成%XX的格式,然后再通过decode还原成中文。当然,不仅仅是中文,许多字符等都是这样操作的。具体的可以自行百度。
-
那么这些中文,是使用的什么编码方式转变为%xxx的形式呢?肯定不是ASCII,因为他压根不认识中文。从我网上查询的资料来看,貌似UTF-8占多数,但好像也有GB2312这种编码方式。
四.一个经典的问题:TXT显示联通乱码
-
新建一个文本文档,在里面输入“联通”2个字。
-
然后关闭文档,重新打开,发现变成乱码了
-
这是为什么呢?我们再写一个TXT文档,写入你好,重新打开文档后,发现是可以正确显示的,我们看一下他的编码方式。通过“另存为”,可以发现编码方式为ANSI
-
在看一下刚才写的联通,发现编码方式为UTF-8,此时隐约可以知道,应该是编码导致的。
-
这里说一个概念:首先,计算机只认识0和1,所以任何字符等在计算机里,都是以二进制的形式存储的,也就是字节的形式存储。那么,当计算机中的字节序列是以某种编码格式存放的,想要将这些字节序列重新变成人所认识的字符串,也需要使用这种编码格式,否则会出现乱码。
-
那么,刚才那个TXT文本,其实就是文本文件。文本文件在计算机中存储的就是字节序列。如果我们直接在中文的电脑上创建一个文本文件,那么这个文本文件只认识ANSI编码,(这句话并不是指文本文件只认识ANSI编码,其实你可以将各种的编码格式的字节存放进去,但在中文机器上直接创建,就有其特殊性)。而联通这两个字巧了,刚好符合UTF-8的编码格式,所以就当做UTF-8存储了,但重新将字节转换为字符串的时候,是以ANSI格式转换的,肯定是乱码。
-
现在,你再试一下,在联通的后面加入任意的字,比如联通哈哈。那么,哈哈2个字和UTF-8的编码格式不一样的,所以仍然会作为ANSI格式存储,就不会有问题了。