在写这边文章时,在网上扒拉了好久,发现好多博客总结的都很是好,我也是参考了不少,在文章最后会列出一些以为不错的博客地址,你们若是有兴趣能够去看看。 html
本篇主要是简单介绍Java编码知识,若是已经很是了解,能够手抖了,把宝贵时间用到看其余文章上面吧。 java
你们都知道中文须要编码后传输才不会有乱码,可是为何要编码呢,由于计算机的一个最基本的存储单元byte没法表示一个中文字符,因此咱们必须先把中文字符通过转换,转换成计算机可以表示的字符。当须要从新读取这些字符时,按照以前的转换规则,再转换回来就能够了。 web
这里的转换规则就是咱们的所说的编码方式了,常见的有ASCII、ISO-8859-一、GB23十二、GBK、UTF-八、UTF-16等。首先咱们的字符在jvm都是Unicode编码,而上面的那些编码方式就是在传输时或显示时用什么样的编码方式。好比你把字符串以UTF-8编码方式转换成Unicode编码存储,而后等再次读取的时候仍是采用UTF-8编码方式来反编码,就能获取到正确的字符。由于Unicode编码采用了世界统一的码表进行编码,所以相同的字符对应不一样的系统或环境对应的Unicode码是同样的。 数据库
好比一个字符串“中国”,他的Unicode码是必定的,若是经过getBytes("GBK")方法,其中的内部逻辑就是首先“中国”的Unicode码转换成GBK编码,而后用GBK编码后的数据进行传递。当对方拿到这个字节数组之后,经过new String(recBytes,"GBK"),就能把获取到的GBK编码的字节数组用GBK编码重组后再转换成Unicode编码来存储或显示。可是对于GBK.GB2312,UTF-8等这些双字节编码而言,对中文进行编码、转码彻底没有问题,只有先后的编码格式同样就能够,而ISO-8859-1这些单字节编码就不行了,由于是单字节,因此能表示的字符范围是0-255,只能对英文字符、数字等表示。好比对于“中国”,用上面的getBytes("ISO-8859-1"),这时你将获得3f,3f(3f表示?),由于ISO-8859-1没有“中国”的对应字符集,因此只好以?来表示了。 数组
最后要说的是,实际上咱们可能会跟各个渠道或设备打交道,好比浏览器、数据库、文件等,在进行转码或存储的时候,最好都指定一个固定的字符集,而后统一进行转换,就不会遇到乱码的问题。对于web项目可能遇到乱码的概率比较大,这个问题会在下一篇文章中集中分析一下。下面附上一些以为不错的文章,不想看本文的能够直接猛击下面连接。 浏览器
http://blog.csdn.net/qinysong/article/details/1179513 jvm
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 编码