Java 乱码解决
%@ page contentType="text/html;charset=utf-8"%
其中:pageEncoding 指的是jsp文件本身在本地保存时的编码方式。contentType的charset是指服务器发送网页内容给客户端时所使用的编码。
从第一次访问一个jsp页面开始,到这个页面被发送到客户端,这个Jsp页面要经过三次编码转换:
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效
所以最终的解决方法为:
在jsp页面设置pageEncoding或者contentType的其中一个为支持中文的编码格式(如utf-8,gbk,gb2312)。因为设置一个的话,另一个默认会和它一样。
如果两个都设置的话,必须保证两个都是支持中文编码(不一定要一样)。
最佳建议设置如下:
%@ page language="java" import="java.util.*" pageEncoding="utf-8"%%@ page contentType="text/html;charset=utf-8"%
2、post方式传值乱码:
由于post方式传值是通过request存储的,在另一个页面也是通过request.getParameter(String name)来提取信息,所以这种情况下的乱码主要是因为request存储信息的编码设置导致的。post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。所以使用如下语句即可得到单个正确的中文字符串:String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;
解决方法:
在接收页面设置request.setCharacterEncoding("UTF-8")。最好通过过滤器实现每个页面都设置为request.setCharacterEncoding("UTF-8")。
3、get方式传值乱码:
get方式传值有两种,一种是表单get传值,另一种是url地址传值(实质上这两种方式都是通过url参数的方式传值)。
表单方式get传值:
表单方式get传值的编码过程为,首先浏览器根据页面的charset编码方式对传值进行编码,然后提交至服务器交给tomcat,tomcat对这些信息进行解码时,采用的解码方式是由server.xml文件中的URIEncoding设置决定的,也就是说,当我们使用命令request.getParameter("")获取表单参数值时,得到的字符串,经过了charset的编码和URIEncoding的解码。
由上所知,只要charset的编码和URIEncoding的解码一致,并且支持中文,就能保证没有乱码。
设置URIEncoding的方法如下:
方法一:
修改$TOMCAT/conf/server.xml文件,在HTTP Connector或者AJP Connector的配置加上URIEncoding="gbk"
... maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk" /
方法二:
使用useBodyEncodingForURI="true". 这个方法适合你的TOMCAT实例下需要跑多个不同Encoding的程序时。
... maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" /
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" useBodyEncodingForURI="true" /
在Tomcat配置中,连接器(HTTP Connector)属性中有一个URIEncoding和
useBodyEncodingForURI属性,这两个属性设置对URL后的附加参数进行URL解码时该如何选择 字符集编码。URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI 则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置,也就是说当 useBodyEncodingForURI属性设置为true时ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/ conf\server.xml文件中找到 Connector 标记,然后在后面加上useBodyEncodingForURI=true)
url方式get传值乱码:
于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至服务器tomcat,所以这个过程为:
首先,url地址中的中文被从gbk转换成ISO-8859-1,交给tomcat后,又被tomcat根据URLEcoding解码,这种情况,只有把URLEcoding设置为gbk才能在request.getParameter("")时不出现乱码。但是这样就会影响到上面的配置,所以一个好的解决方法是,使用java.net.URLEcoder和URLDecoder对地址中的中文进行手动编码和解码。
所以一个万全的解决方法为:
1)所有页面的charset设置为UTF-8。
2)Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
3)添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
4)url地址中存在中文参数时,首先对中文参数使用URLEcoder编码为utf-8,然后在request.getParameter("")接收到参数后再使用URLDecoder还原。例如:
From.jsp页面:
%String username = "张某某" ;username = URLEncoder.encode(username,"utf-8");
%
a href="to.jsp?param= %=username % " 转入 /a
To.jsp页面
%=URLDecoder.decode(request.getParameter("param"),"utf-8")%总之 ,乱码的解决方案如下:
post传值乱码时,在接收端设置request.setCharacterEncoding("UTF-8")
get传值或者url乱码时,手动设置接收的参数String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;
由上可见get,post传值在tomcat5中是不一样的
本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/
你了解java中的几种编码方式?解决乱码问题可能并不麻烦 编码的转换通常在IO机制中使用,一个好的编码可以为我们节省很多空间,在某种程度上提高我们应用的效率。由于之前就知道String中的转换方式,还有一些工具类,因此今天就好好的整理一下java中jdk提供的几种转换方式,希望对你有帮助。
相关文章
- 解决IDEA导入Eclipse项目时,编译报错“ Error:(1, 1) java: 非法字符: ‘ufeff’”
- 【JAVA】Eclipse中开启java和xml智能提示功能(图文,已解决!)
- Java面试中如何介绍自己的项目经验?
- Java核心技术卷I基础知识3.1 一个简单的Java应用程序
- [转]java.lang.OutOfMemoryError: PermGen space及其解决方法
- sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class异常解决方法
- JAVA础--利用java反射机制绕过编译时的类型检查和访问控制检查
- 解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
- Java开发环境的搭建以及使用eclipse从头一步步创建java项目
- java下载word,解决文件名中文乱码的问题(包括edge跟ie11)
- java中解决request中文乱码问题
- Error running 'dt-assets-monitor [clean]': Cannot run program "C:Program Files (x86)Javajdk1.8.0_73binjava.exe" (in directory "E:codedt-assets-monitor")
- Java学习-084-java.sql.SQLException: Zero date value prohibited 问题解决
- Java学习-010-创建文件夹源代码
- java中文乱码解决之道(八)—–解决URL中文乱码问题
- java.sql.SQLException: No suitable driver(解决)
- Java_并发工具包 java.util.concurrent 用户指南(转)
- Java_类似java.lang.VerifyError: Expecting a stackmap frame at branch target 22 in method的解决方法
- 浅析Java对集合进行操作时报java.util.ConcurrentModificationException并发修改异常问题:产生原因、单线程/多线程环境解决、CopyOnWriteArrayList线程安全的ArrayList、fail-fast快速失败机制防止多线程修改集合造成并发问题
- 浅析Java如何使用docker-java库操作DockerAPI
- JAVA学习.java.sql.date 与java.util.date以及gettime()方法的分析
- Java空指针异常解决java.lang.NullPointerException解决心得
- How to improve Java's I/O performance( 提升 java i/o 性能)
- java高级工程师开放面试题集<一>
- Java小白入门200例98之Java异常
- [Android Studio] Java onClickListener is abstract; cannot be instantiated(...是抽象的,无法实例化)的解决
- Java使用jxl.jar操作excel,合并单元格等