- 解决中文乱码问题
Jsp程序的开发过程中经常会遇到中文乱码问题,以下几种中文乱码的情况。
- 页面乱码
问题描述:页面乱码一般是因为编译时没有指定字符集造成的
解决办法:在jsp的page指令中添加<%@ pageEncoding=”GBK”%>就可以解决。
如下所示:<%@ page contentType=”text/html;charset=GBK” language=”java” import=”java.sql.*” errorPage=”” %>
- 访问servlet时出现乱码:
问题描述:在请求servlet时,返回结果出现乱码。
解决办法:在servlet中使用response输出,在输出内容之前,先执行response.setContentType(“text/html;charset=GBK”)
- Get方式表单传递和URL方式传递是乱码:
解决办法:设置服务器,设置服务器,即在tomcat安装目录下找到conf/server.xml,设置URIEncoding=”GBK”如下所示:
<Connector port=”8080”protocol=”HTTP/1.1”connectionTimeout=”20000”redirectPort=”8433”URIEncoding=”GBK”>
此外,对于get方式提交的表单,可以采用数组字节转换的方式
即将获得的字符转换为字节数组,然后再生成字符串,其代码段如下:
<%
Public String chgStr(String str){
Try{
String temp_p=str;
byte[] temp_t=temp_p.getBytes(“ISO8859-1”);
String temp=new String(temp_t);
return temp;
}catch(Exception e){
return null;
}
}
%>
<%
String name=chgStr(request.getParameter(“name”));
%>
chgStr()方法就是将get方式提交的数据通过编码转换,让中文显示正常。
- Post方式表单传递参数乱码
问题描述:通过表单以post方式提交数据给JSP或Servlet而出现中文乱码的情况。
解决办法:在接收post提交的参数之前,使用request.setCharacterEncoding(“GBK”)语句设定request对象接收参数时使用GBK编码。
- 使用过滤器,建立Encoding过滤器,通过过滤器,解决所有post提交的数据的中文乱码的问题。
对应的过滤器如下所示:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding=null;
protected FilterConfig filterConfig=null;
public SetCharacterEncodingFilter() {
}
public void destroy() {
this.encoding=null;
this.filterConfig=null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if(request.getCharacterEncoding()==null){
String encoding=getEncoding();
if(encoding!=null){
request.setCharacterEncoding(encoding);
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
}
protected String getEncoding(){
return (this.encoding);
}
}
配置如下:
<filter>
<display-name>SetCharacterEncodingFilter</display-name>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>filter.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/SetCharacterEncodingFilter</url-pattern>
</filter-mapping>
- MySql数据库读取写入数据时出现乱码
问题描述:当通过SQL语句写入数据或读取数据时出现乱码的情况,这是由于JDBC连接MySql时编码不一致造成的。
解决办法:连接数据库时,指定连接数据库URL中字符集的属性
getConnection(url,username,password)
在java程序通过JDBC连接时:url=”jdbc:mysql://127.0.0.1:3306/hnet?useUnicode=true&characterEncoding=GBK”;
若在XML中配置JNDI时,则为:
Url=”jdbc:mysql://127.0.0.1:3306/hnet?useUnicode=true&characterEncoding=GBK”;其中characterEncoding=GBK表示指定字符集为中文。