java如何解决乱码问题

| 大大范文

做项目经常会遇到Java中的乱码问题,那么遇到乱码问题怎么解决呢?下面小编为大家解答一下,希望能帮到大家!

分析编码与解码

java如何解决乱码问题

编码就是将字符转为字节,解码就是就是将字节转换为字符。

字节流与字符流

对文件的读写*作都是通过字节流来实现的,即使JAVA中有字符流,但是其底层仍然使用的字节流。

乱码问题出现

java中使用最频繁的是字符,当我们将文件读入内存并在控制台显示时(字节流--->字符流),就需要用到解码。如果文件是UTF-8编码,而我们解码时错用成GBK(如果不指定编码,JAVA会采取系统默认编码)来解码,那么只能显示乱码。而我们写文件时,最好指定编码(UTF-8)。

解决方案

示例1

将字节流转换为字符流时,我们指定编码格式。这是我们文件也应该是gb2312编码

publicstaticStringread(Stringfilename)throwsException{InputStreamis=newFileInputStream(filename);BufferedReaderin=newBufferedReader(newInputStreamReader(is,"gb2312"));//指定编码格式Strings;StringBuildersb=newStringBuilder();while((s=in.readLine())!=null){sb.append(s+"n");}in.close();returnsb.toString();}

示例2

直接通过字节流读入,使用String转换为字符时,指定编码。

package.dy.xidian;importjava.io.FileInputStream;importjava.io.InputStream;classBufferedInputFile{publicstaticStringread(Stringfilename)throwsException{@SuppressWarnings("resource")InputStreamis=newFileInputStream(filename);byte[]b=newbyte[1024];is.read(b);returnnewString(b,"gb2312");}}publicclassMemoryInput{publicstaticvoidmain(String[]args)throwsException{Stringfilename="E:/html/gb2312.php";Strings=BufferedInputFile.read(filename);System.out.println(s);}}

陷阱

I/O*作中有个FileReader类,这个类隐藏了字节流转为字符流的细节,我们可以这样使用。BufferedReaderin=newBufferedReader(newFileReader(filename));这样,我们直接得到就是字符流了。但我们发现,我们并没有去设置编码,这是因为FileReader中采用了默认编码方式。这就变得很危险了,如果其默认的编码格式和我们文件的编码不同,那么读出来的数据一定是乱码。所以我们最好采用示例中的方式来进行流的转换。

 

第2篇:如何解决java乱码

同样的java文件,如果使用不用的工具、编译有可能出现乱码,这是为什么呢?以下是小编为大家搜索整理的如何解决java乱码,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!

GBK编码

GBK编码是*制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。

UTF-8编码

UTF-8编码可以通过屏蔽位和移位*作快速读写。字符串比较时strcmp()和wcscmp()的返回结果相同,因此使排序变得更加容易。字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来表明UTF-16或UTF-32文本(见BOM)UTF-8是字节顺序无关的。它的字节顺序在所有系统中都是一样的,因此它实际上并不需要BOM。

GB2312

GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集(DBCS)。

1、文件表头添加

2、htmlhead里面添加

3、获取数据

Stringstr=newString(request.getParameter("name").getBytes("ISO8859-1"),"GBK");

out.println(str);

Stringstr=newString(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8");

4、tomcat

maxThreads="150"minSpareThreads="25"maxSpareThreads="75"

enableLookups="false"redirectPort="8443"acceptCount="100"

debug="0"connectionTimeout="20000"useBodyEncodingForURI="true"

disableUploadTimeout="true"URIEncoding=”UTF-8”/>

5、获取数值

request.setCharacterEncoding("gbk");

 

第3篇:Java如何解决URL中文乱码

我们主要通过两种形式提交向服务器发送请求:URL、表单。而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面。URL向服务器发送请求编码过程实在是实在太混乱了。不同的*作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。如果程序员要把每一种结果都考虑进去,是不是太恐怖了?有没有办法,能够保证客户端只用一种编码方法向服务器发出请求?下面是相关的知识,欢迎阅读。

主要提供以下几种方法

一、javascript

使用javascript编码不给浏览器插手的机会,编码之后再向服务器发送请求,然后在服务器中解码。在掌握该方法的时候,我们需要料及javascript编码的三个方法:escape()、encodeURI()、encodeURIComponent()。

1、escape

采用SIOLatin字符集对指定的字符串进行编码。所有非ASCII字符都会被编码为%xx格式的字符串,其中xx表示该字符在字符集中所对应的16进制数字。例如,格式对应的编码为。它对应的解码方法为unescape()。

事实上escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如上面“我是cm”的结果为%u6211%u662Fcm,其中“我”对应的编码为6211,“是”的编码为662F,“cm”编码为cm。

注意,escape()不对”+”编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。

2、encodeURI

对整个URL进行编码,它采用的是UTF-8格式输出编码后的字符串。不过encodeURI除了ASCII编码外对于一些特殊的字符也不会进行编码如:!@#$&*()=:/;?+‘。

3、encodeURIComponent()

把URI字符串采用UTF-8编码格式转化成escape格式的字符串。相对于encodeURI,encodeURIComponent会更加强大,它会对那些在encodeURI()中不被编码的符号(;/?:@&=+$,#)统统会被编码。但是encodeURIComponent只会对URL的组成部分进行个别编码,而不用于对整个URL进行编码。对应解码函数方法decodeURIComponent。

当然我们一般都是使用encodeURI方来进行编码*作。所谓的javascript两次编码后台两次解码就是使用该方法。javascript解决该问题有一次转码、两次转码两种解决方法。

一次转码

javascript转码:

varurl='/ShowMoblieQRCode.servlet?name=我是cm';

window.location.href=encodeURI(url);

转码后的URL:127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%E6%88%91%E6%98%AFcm

后台处理:

Stringname=request.getParameter("name");

System.out.println("前台传入参数:"+name);

name=newString(name.getBytes("ISO-8859-1"),"UTF-8");

System.out.println("经过解码后参数:"+name);

输出结果:

前台传入参数:??????cm

经过解码后参数:我是cm

二次转码

javascript

varurl='/ShowMoblieQRCode.servlet?name=我是cm';

window.location.href=encodeURI(encodeURI(url));

转码后的url:127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%25E6%2588%2591%25E6%2598%25AFcm

后台处理:

Stringname=request.getParameter("name");

System.out.println("前台传入参数:"+name);

name=URLDecoder.decode(name,"UTF-8");

System.out.println("经过解码后参数:"+name);

输出结果:

前台传入参数:E68891E698AFcm

经过解码后参数:我是cm

二、filter

使用过滤器,过滤器LZ提供两种,第一种设置编码,第二种直接在过滤器中进行解码*作。

1、过滤器1

该过滤器是直接设置request的编码格式的。

publicclassCharacterEncodingimplementsFilter{

privateFilterConfigconfig;

Stringencoding=null;

publicvoiddestroy(){

config=null;

}

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsIOException,ServletException{

request.setCharacterEncoding(encoding);

chain.doFilter(request,response);

}

publicvoidinit(FilterConfigconfig)throwsServletException{

this.config=config;

//获取配置参数

Stringstr=config.getInitParameter("encoding");

if(str!=null){

encoding=str;

}

}

}

配置:

chineseEncoding

.test.filter.CharacterEncoding

encoding

utf-8

chineseEncoding

publicvoidinit(FilterConfigfilterConfig){

this.filterConfig=filterConfig;

}

privateStringtoUTF(StringinStr)throwsUnsupportedEncodingException{

StringoutStr="";

if(inStr!=null){

outStr=newString(inStr.getBytes("iso-8859-1"),"UTF-8");

}

returnoutStr;

}

publicvoiddoFilter(ServletRequestservletRequest,

ServletResponseservletResponse,FilterChainchain)throwsIOException,

ServletException{

HttpServletRequestrequest=(HttpServletRequest)servletRequest;

HttpServletResponseresponse=(HttpServletResponse)servletResponse;

//获得请求的方式(1.postor2.get),根据不同请求方式进行不同处理

Stringmethod=request.getMethod();

//1.以post方式提交的请求,直接设置编码为UTF-8

if(method.equalsIgnoreCase("post")){

try{

request.setCharacterEncoding("UTF-8");

}catch(UnsupportedEncodingExceptione){

e.printStackTrace();

}

}

//2.以get方式提交的请求

else{

//取出客户提交的参数集

EnumerationparamNames=request.getParameterNames();

//遍历参数集取出每个参数的名称及值

while(paramNames.hasMoreElements()){

Stringname=paramNames.nextElement();//取出参数名称

Stringvalues[]=request.getParameterValues(name);//根据参数名称取出其值

//如果参数值集不为空

if(values!=null){

//遍历参数值集

for(inti=0;i<values.length;i++){

try{

//回圈依次将每个值调用toUTF(values[i])方法转换参数值的字元编码

Stringvlustr=toUTF(values[i]);

values[i]=vlustr;

}catch(UnsupportedEncodingExceptione){

e.printStackTrace();

}

}

//将该值以属*的形式藏在request

request.setAttribute(name,values);

}

}

}

//设置响应方式和支持中文的字元集

response.setContentType("text/html;charset=UTF-8");

//继续执行下一个filter,无一下个filter则执行请求

chain.doFilter(request,response);

}

}

配置:

chineseEncoding

.test.filter.CharacterEncoding

chineseEncoding

/*

三、其他

1、设置pageEncoding、contentType

2、设置tomcat的URIEncoding

在默认情况下,tomcat服务器使用的是ISO-8859-1编码格式来编码的,URIEncoding参数对get请求的URL进行编码,所以我们只需要在tomcat的server.xml文件的标签中加上URIEncoding=”utf-8″即可。