关于java的乱码,一直是双字节字符环境开发者的问题,不同的服务,不同的版本,甚至不同的系统环境,都有很大的影响。
今天说一下,在中文windows下,Tomcat5.5服务下的,UTF-8的乱码解决问题。
首先要需要了解的是web容器默认编码是iso-8859-1,一个汉字占用两个字节,而在utf-8中一个汉字占用三个字节。所以在数据传递过程中,必须手动设定容器编码格式,否则会出现字符位丢失的情况。即3个字节变为两个字节,自然会变成乱码。
其次,Tomcat 5以后,对post和get方法的编码控制分开了,像以前那样,仅仅
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
不能解决问题了。
明白了这个以后,再来看
第一步,修改tomcat。
找到对应站点的server.xml后,在里面的Connector标签里面添加
useBodyEncodingForURI="true"
这句的话告诉tomcat用页面的编码去处理post,推荐使用。
这块有句更狠的就是
URIEncoding="utf-8"
不过是强制指定编码了,所以一旦有其他编码的页面存在,就会出问题,所以不建议用。
第二步,修改jsp页面头。
我是偷懒,全都加上了
<%@ page language="java" pageEncoding="UTF-8"%>
,然后在html标签的head标签里加上
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
第三步,修改指定编码。
在jsp头部分,任何request和response被使用前,加上
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
经过以上三步后,post过来的文字就可以正常的用request.getParameter()取得并使用了。
第四步,修改用get方法传出的连接参数。
new String(java.net.URLEncoder.encode("输入文字","UTF-8"));
记得try一下,我是封装的一下用的。
经过以上几步,基本上乱码的问题解决了。
======================================================================
实践步骤:
1.修改server.xml,在里面的Connector标签里面添加
useBodyEncodingForURI="true"
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector
port="8001" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true"/>
<!-- Note : To disable connection timeouts, set connectionTimeout value
2.修改工程中的web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
3.在jsp页面开头使用:
<%@page language="java" errorPage="/error.jsp" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
4.OK,这样就能大概能正常向后台传中文了。
如果仍然不能,则使用javascript函数encodeURI(str)来转换向后台传递的参数。
5.后台向页面传中文参数,是这样:
String Data="数据";
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println(Data);
//-------------------------------------------------
关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容编码 JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页,用的是contentType。第一阶段是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就发挥了功效 contentType的設定. pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. 而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。 jsp文件不像.java,.java在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码,比如中国大陆就是GBK,台湾就是 BIG5或者MS950。而一般我们不管是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采用的方法刚好可以让虚拟机得到正确的资料。但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。 举个例子: <%@ page contentType="text/html;charset=utf-8" %> 大都会打印出乱码,因为输入的“你好”是gbk的,但是服务器是否正确抓到“你好”不得而知。
//----------------------------------------------------------------
分享到:
相关推荐
1)JSP+javabean+DAO(Ajax:anywhere) 2)Struts+spring+hibernate3(AJax:DOJO) 3)JSF+richfaces+seam+EJB 总共3个完整的实例,并配有需求分析~~~~~~~~,绝对经典!
基于 jsp + servlet + jquery + easy-ui + ajax 的学生成绩管理系统 基于 jsp + servlet + jquery + easy-ui + ajax 的学生成绩管理系统 基于 jsp + servlet + jquery + easy-ui + ajax 的学生成绩管理系统 基于 jsp...
Jquery.Pagination.js + Jquery.Ajax + ASP.NET----无刷新分页Pagination 1.5.1,是在原作者基础上修改的,因为Pagination 1.5.1与它的低版本有很大的区别,所以在此实例中增加了新版的使用方法
### jsp环境搭建Eclipse3.2+MyEclipse5.5+Tomcat5.5 #### 一、概述 本文旨在详细介绍如何搭建基于Eclipse3.2、MyEclipse5.5和Tomcat5.5的Java Web开发环境。这是一套经典的组合,非常适合初学者入门以及进行简单的...
在"ASP+ajax+jQuery--顶-踩-无刷新【点赞】程式3.0 修正调试版"中,开发者可能已经解决了之前版本的问题,提高了性能和用户体验。调试版通常意味着开发者对代码进行了优化,修复了错误,确保程序稳定运行。 总结来...
以下是对Web开发中遇到的UTF-8问题的详细总结: 1. HTML页面转UTF-8编码问题: - 在HTML文件的部分,在标签之前添加`<meta>`标签,指定页面内容的字符集为UTF-8: `<meta http-equiv="Content-Type" content=...
1.通过google ehcache-spring-annotatios.jar自动注解方式实现整合Spring+Ehcache。 2.Action里通过struts2-spring-plugin.jar插件自动根据名字注入。 3.Ajax无刷新异步调用Struts2,返回Json数据,以用户注册为例。...
基于Ajax+J2EE的MicroERP源码下载_microerp-0.1.zip
以前不知道哪里找到的一个系统,感觉很不错,使用文档,数据库文件,项目截图全都包括,后台使用Servlet+Jsp,前台用的H-ui+EasyUI+jQuery,很适合新手入门的学习,特别是代码里面许许多多的注释,让我受益匪浅,...
Spring 框架是 Java 开发中的一个全面解决方案,它不仅提供了 IoC(Inversion of Control)和 AOP(Aspect-Oriented Programming)功能,还涵盖了数据访问、Web 应用开发、事务管理等多个方面。Spring 2.5 版本在此...
ASP页面UTF-8编码乱码问题的解决方法涉及到字符编码的知识点,主要需要理解以下几个方面: 1. 字符编码基础知识 字符编码是用于文本数据转换为另一种格式的标准。不同的编码方式用于不同的语言环境,解决乱码问题的...
[信息办公]基于Ajax+J2EE的MicroERP源码下载_microerp-0.1.zip
jsp源码[信息办公]基于Ajax+J2EE的MicroERP源码下载_microerp-0.1本资源系百度网盘分享地址
基于Java+MySQL+JavaScript+Ajax+Servlet+Filter+CSS+JSP+tomcat的信息管理系统的源码,适用于MySQL5.x,idea,tomcat8-9,拥有基本的信息的增删改查,查找方式多种,登录功能。字符集选择UTF-8,可在此基础上修改为...
前端页面通过ajax发送请求,参数都是默认使用utf-8编码格式对参数进行url编码,这样的后果就是,当后台页面如果使用gbk编码的话,会出现乱码的情况,然后网上找到一个大神写的gbk.js. 但是里面没有做出详细介绍,这里...
《疯狂Ajax讲义:Prototype/jQuery+DWR+Spring+Hibernate整合开发》是疯狂Java体系丛书之一,前8章基本以XHTML、JavaScript和DOM编程为主,无须任何基础即可阅读;第9章以后的内容则需要掌握Spring、Hibernate等Java ...
本文将深入探讨Ajax中文乱码问题的成因,并提供一系列解决方案。 **一、问题原因** 1. **编码格式不一致**:服务器与客户端(浏览器)之间使用的字符编码格式不同,例如服务器使用GBK编码,而浏览器使用UTF-8编码...
5个AJAX的例子和2个Lucene的例子。 直接解压或者使用虚拟光驱,既可查看。
Ajax-Spring-MVC-CRUD-form-submit-and-ajax.zip,spring mvc crud应用程序(springmvc、hibernate 4.x、bootstrap 3.x、jquery、mysql),ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json...