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″即可。
上一篇:有哪些关于水的谜语
下一篇:用自己的心灵面对生活