java中⽂乱码终极解决⽅案
中⽂乱码终极解决⽅案
乱码问题好像跟我们中国程序员特别有缘,⼀直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,⽆⼀不是搞得许多程序员焦头烂额的,整天骂XXX产品对中⽂⽀持不了,UTF-8⽆法使⽤中⽂啊什么的,其实这⾥⾯被骂的产品中其实99%以上是对中⽂⽀持⾮常好的,⽽出现乱码的原因只是因为⾃⾝对国际化⽀持以及⽂件编码等信息的认识不知造成的。要知道⼀个产品那么流⾏,怎么可能对中⽂⽀持不了呢,下⾯就开始⼀⼀帮⼤家解决这些问题。
1 、编码
--想要解决好中⽂问题,对编码肯定是不能⼀概不懂了,编码是解决中⽂乱码问题的根本。
编码⽐较常⽤的有: UTF-8 , GBK , GB2312 , ISO-8859-1 ,除了 iso-8859-1 之外的其它三个编码都能很好的⽀持中⽂,但它们都兼容 ISO-8859-1 的编码(就是说⽆论编码怎么改变,只要是 ISO-8859-1 中的字符,永远不会出现乱码)。
这四种编码中, GB2312 是中国规定的汉字编码,也可以说是简体中⽂的字符集编码 ; GBK 是 GB2312 的扩展 , 除了兼容GB2312 外,它还能显⽰繁体中⽂,还有⽇⽂的假名 ; ⽽ UTF-8 虽然也⽀持中⽂,但却
与 GB 码不兼容(编码值不同)。UTF-8 使⽤的是可变长的 UNICODE 编码,编码可能是 1 位 16 进制(即 ISO-8859-1 中的字符,其编码也是相同的)也有可能是 2 位或 3 位的 16 进制。 UTF-8 的优点是:1 、与 CPU 字节顺序⽆关 , 可以在不同平台之间交流。 2 、容错能⼒⾼ , 任何⼀个字节损坏后 , 最多只会导致⼀个编码码位损失 , 不会链锁错误 ( 如 GB 码错⼀个字节就会整⾏乱码 ) ,所以在国际化处理中基本都是建议使⽤ UTF-8 作为编码。
2、⽂件的编码
--虽然说只要设置了正确的编码就可以使字符正确显⽰了,但如果忽略了⽂件保存时的编码的话,那可是会让你⾛进迷雾中的。
eclipse如何设置为中文⽂件编码最常使⽤的有两种:ANSI和UTF-8,光看名字估计你都可以猜到了,ANSI就是我们保存⽂件时使⽤的默认编码,⽽UTF-8则需⾃⼰设置。对于编码的改变,我使⽤的⼯具是NOTEPAD和ECLIPSE,NOTEPAD 使⽤最简单,只要打开⽂件后在另存为中选择相应的编码就⾏了,⽽且它对编码的⽀持⾮常好;⽽在ECLIPSE 中,只要稍微设置⼀下就⾏了,打开⾸选项,然后选择:常规->内容类型(ContentType),在右边选中你想改变保存编码的⽂件类型,然后在下⽅的缺省编码中改变其值,最后点击更新(UPDATE)按钮即可。
⽽在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).⽽根据前⾯所
说的UTF-8和GBK,GB2312等的编码值是不同的这⼀点,可以知道,如果⽂件使⽤了UTF-8,那么字符编码就必须使⽤UTF-8,否则编码值的不同就可能造成乱码。⽽这也就是为什么那么多的⼈使⽤了UTF-8编码后还会产⽣乱码的根本原因。(JS和JSP都是这个道理)
3、JSP,STRUTS等的中⽂乱码解决⽅案
其实解决的⽅法只有⼀个:
request.setCharacterEncoding(encoding);
⽅法只有⼀种,但处理⽅式就多种多样了,初学者会在JSP页⾯上直接使⽤,⽽有经验的程序员会使⽤过滤器。⽽现在所要说的⽅法也是过滤器。这⾥以统⼀使⽤UTF-8作为编码作为例⼦说明。具体过程就不多说了,⽹上有很多教程。偷懒⼀点的,到TOMCAT中复制就⾏了。在TOMCAT的⽬录下的
\webapps\jsp-examples\WEB-INF\classes\filters\到SetCharacterEncodingFilter.java 这个类,放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使⽤ '*'
< filter-mapping >
< filter-name > Set Character Encoding