今天彻底理解了中文乱码问题,写个随笔记录一下。方便日后查阅。
主流的编码方式有ASCII(美国码),ISO88591(latin码),GBK码(国标码,也叫中国码),Unicod码(万国码,主流码,苹果推荐),Unicode-Bom(微软自家码,windows系统).
现在对这几个编码进行简单描述:
ASCII这个可以说是刚接触编程必须了解的。机器由于只认识0-1,都知道机器产自国外,国外使用的英文标准。要让机器识别英文字母,聪明的人想到其实可以通过关系映射将字母映射为数字,机器处理数字是很简单的。所以才产生了ASCII码。但是发展到现在,这种编码方式完全不适合大部分的需求。所以才有之后的各种编码方式。该编码方式字符占1个字节(byte)。
ISO88591这个是JAVA必须知道的。由于都是接触到Tomcat服务器,此服务器的编码方式就是ISO编码方式。这个不常用,除了这里。此编码方式占1字节(byte)。
GBK这个是中国科学家研究出来的,也就相当于当初设计ASCII码一样的道理,但是中国文字这么多,还不包括繁体。只能说大部分都囊括了中华文字。此编码方式中文占2字节(byte)。
Unicod码简称万国码,适应当今很多国家的编码方式。具体我也太清楚,只知道这个是现在都使用的,这个就够了。如果网站是中国网站,编码方式如果是GBK编码方式,那么在国外访问将会出现乱码,但是Unicode编码方式中文占3字节(byte),相对GBk来说是更占内存的,但是一般这点内存肯定是不考虑的。苹果推崇此编码方式,现在或者将来都会是潮流。记住都使用该编码方式即可。
Unicode-Boom该编码方式比较变态,是微软自己设计的,没有编码规范。此编码方式同Unicod编码方式差不多,但是会在每个文件默认添加3字节(byte)。Windows系统默认都是此编码方式。你看到的Unicode编码方式其实是假的,可以通过notepad++去查看文件编码方式。
现在来说说应用。由于传输都是通过byte字节流去传输。如果想传输"你好世界",需要先将这个字符串转为字节流。如果是通过一种编码方式去编码,同样是需要该种编码方式去解码,才能看到你真正的"你好世界"。举个粟子,如果通过GBK编码转为字节流,改字节流有8字节,接受的话同样适用GBK去解码理论上讲这样才是对的。但是当你适用ISO去解码的话由于每个字节都是相当于一个东西,所以得到打印的东西很可能是长度为8的看不懂的东西,如果适用Unicode码去解码的话由于Unicode是3字节,所以解码出来是3个字符,可能的结果是2个看不懂的中文加一个什么东西。
这里有个用处,由于Tomcat使用的ISO编码方式,中文都看不懂,所以中文传输的话,先是框架将中文转为ISO编码方式,所以需要先通过IOS解码方式变成字节流。再通过Unicod编码方式去编码。这样你才能看得懂.