java 汉字乱码_Java中文乱码问题

2022-09-14 10:05:52 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

一、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”));

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158634.html原文链接:https://javaforall.cn

0 人点赞