2013年一二月份寒假SSH项目——乱码问题

1、页面乱码问题

sp页面显示中文乱码:    jsp页面的编码方式有两个地方需要设置: 

  <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  

 <%@ 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")%>

 

4、保存到数据库乱码

今天遇到一个之前从来没遇到的问题,就是网站全部用utf-8 ,tomcat也用utf-8,mysql在安装时也是选择了utf-8,还有创建数据库和表的属性都是utf-8,但是在把页面的数据保存到数据库的时候还是出现了???,最后发现mysql的配置文件MY.ini中还是存在不少utf-8的配置

修改my.ini文件(存在两处,两处都必须修改)

然后重启下数据库,最后解决了问题

重启数据库的两种方法

一、MYSQL服务

我的电脑——(右键)管理——服务与应用程序——服务——MYSQL——开启(停止、重启动)

二、命令行方式

 Windows

  1.点击“开始”->“运行”(快捷键Win+R)。

  2.启动:输入 net stop mysql

  3.停止:输入 net start mysql

 

SSH常见的配置方法

三个地方保持一致

1、web.xml中的encodingFilter配置,如下

	<filter>                               
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>com.bnuz.ziz.filter.CharacterEncodingFilter</filter-class>
		<init-param>       
			<param-name>characterEncoding</param-name>
			<param-value>UTF-8</param-value>    
		</init-param>                
		<init-param>
			<param-name>enabled</param-name>
			<param-value>true</param-value>
		</init-param>  
	</filter> 
	<filter-mapping>   
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping> 


或者用Spring的过滤器

<filter>
  <filter-name>springEncoding </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>springEncoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

2、在jsp页面中加入
 

  <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  

 <%@ page contentType="text/html;charset=utf-8"%>   


 3、数据库编码也设置成跟上面一致

我还遇到过通过以上设置如果还存在问题,页面显示仍然还是乱码,这时候有可能是jsp文件本身编码问题,可以新建jsp页面并设置编码,把有问题的页面内容复制过去

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值