本文共 3358 字,大约阅读时间需要 11 分钟。
一、MyEclipse 下的java文件中文乱码问题(MyEclipse
6.5):
解决方法一:Window
--à
Preferences… --à
General --àContent Types --à
Text --à
Java Source File 中Default encoding 改写成UTF-8(你所需的编码类型) 然后Update,OK确定就可以了。
二、
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、文件的编码
虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。
文件编码最常使用的有两种:ANSI和UTF-8, ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好。而在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点,可以知道,如果文件使用了UTF-8,那么字符编码就必须使用UTF-8,否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。(JS和JSP都是这个道理)
3、资源文件的乱码解决方案
资源文件谁都知道是国际化支持不可或缺的一部分,资源文件的乱码原因也是因为使用了UTF-8做为JSP编码后,没有相应地改变资源文件的文件编码造成的,所以只要对资源文件保存的编码进行更正后,乱码问题也就解决了。当然,你的中文要使用
native2ascii
命令进行正确的转换。
4、调用JS时,JS内容乱码的解决方案。
其实JS的乱码还是跟文件的编码有关系的,如果JS中有中文的话,那JS文件保存的编码就必须跟调用此JS的页面编码相同,否则,你的所有中文都要从JSP页面传给JS才会显示正常。
5、AJAX提交数据乱码,返回数据乱码的解决方案
随着AJAX的流行,乱码问题也开始困扰着许多刚开始使用它的程序员,万变不离其宗,AJAX的乱码问题自然跟编码有关了,我想很多人想到了对文件编码进行设置,并且在接数据时设置了requet的编码,在返回的数据时设置了response的编码一切都以为会很顺利,可是这一切都是徒劳无功的。解决的方法其实很简单,而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码
程序代码:
xmlhttp.open( "post", url, async );
xmlhttp.setRequestHeader( "Content-Type",
"text/html" );
xmlhttp.send( params );
setRequestHeader并不是不变的,也没人想过去改它,而问题就正好出在这个地方。回想一个JSP页面内容的编码设置,其中有这么一节:
程序代码:
contentType="text/html;charset=UTF-8";
现在知道问题了吧,所以我们要把第二句代码改为:
程序代码:
xmlhttp.setRequestHeader( "Content-Type",
"text/html;charset=UTF-8" );
最后别忘了在返回数据时也设置上:
程序代码:
response.setContentType( "text/xml"
);
response.setCharacterEncoding( "UTF-8"
);
如果要问为什么的话,其实我们可以把xmlhttp看成是一个临时页面,它由浏览器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe)。所以对于普通页面设置的编码,对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知,jsp的最后形态就是servlet,而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话:
response.setContentType( "text/html" );
response.setCharacterEncoding( "UTF-8" );
而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存(这跟之后生成的CLASS有关系)。所以在servlet设置response的编码也是理所当然的了。
三、大家都知道,xmlhttp在通信时采用的是utf编码,而国内很多网页的信息都是采用gbk编码,所以当直接通过ajax去连接网页,并将获取到的信息直接显示的话就会出现乱码的现象,有些时候无法改变服务器端网页的编码(例如获取别的网站的天气预报信息),在这种时候就只能在客户端通过js做编码的工作了,下面这段js就是用于将服务器端返回的gbk编码字符串转换为utf编码字符串:
最后是项目中出现的乱码问题及解决方法:
问题描述:使用javascript传递参数的方式将中文参数传给java中的action部件。页面编码为GBK,在javascript用httprequest传递时发生参数乱码的变动的问题,应该是xmlhttp的content-type的问题,但是我们原则上不改变原有代码,因此采用了以下办法。
1,不改变页面编码,仍然维持编码格式为GBK。
2,在javascript附加参数时对参数进行一次转码.采用javascript的方法encodeURI对中文参数进行转换。
3,维持原有xmlhttprequest的content-type不变仍然为:http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
4,增加一个工具类进行转码处理,增加方法:
程序代码
public
static String isoToUTF8(String str) {
try
{
if
(!str.equals("")) {
URLEncoder.encode(str, "gbk");
str=
new String(str.getBytes("gbk"), "utf8").toString();
}
}
catch (UnsupportedEncodingException e) {
m_logger.error("occurs a exception when change the
coding to UTF8:", e);
}
return
str;
}
5,修改action中获取request参数的部分代码
ClassName.isoToUTF8(request.getParameter("parameterName"));
转载地址:http://ofnzx.baihongyu.com/