在jsp实际应用中,经常会碰到中文乱码,下面给出一些实际应用的解决方案
首先需要定义一个字符请求过滤器,并在web.xml中配置
package com.util;
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;
import javax.servlet.http.HttpServletRequest;
public class filter implements Filter {
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException
{
try
{
// 设置用户请求的编码格式
request.setCharacterEncoding( "GBK" );
chain.doFilter(request, response);
}
catch (Throwable ex)
{
ex.printStackTrace();
}
}
public void init(FilterConfig filterConfig) throws ServletException {}
/**
* Servlet的销毁方法
* 用于释放过滤器所申请的资源
*/
public void destroy() {}
}
在web.xml中添加
<filter>
<filter-name>filter</filter-name>
<filter-class>com.util.filter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
mysql 配置过程中,编码方式的选择可以分为三种情况:
1,选择按照gbk安装 ,这种情况下,只需要把连接的url写成
jdbc:mysql://127.0.0.1:3306/abc?autoReconnect=true&useUnicode=true&characterEncoding=GBK&mysqlEncoding=GBK
即可,建数据库和建表都是不需要设置,完成后即是正常编码
2,如果选择默认安装,数据库的编码格式是latin1格式,这种情况下,需要在建表的时候指定编码格式,(SHOW VARIABLES LIKE 'character_set%'; 查看mysql当前字符集)
这是如果导入已经有的数据库就会出现乱码,这是需要修改MYSQL的配置文件my.ini
default-character-set=latin1 修改为 default-character-set=GBK
如果导入已经 用
例如:
create table test (
id char(32) not null,
name varchar(50) not null,
content longtext not null,
ttime datetime not null,
iscreate int default -1,
ip char(15),
primary key(id)
) default character set gbk
连接字符串也设置为
jdbc:mysql://127.0.0.1:3306/abc?autoReconnect=true&useUnicode=true&characterEncoding=GBK&mysqlEncoding=GBK
完成后即是正常编码,如果数据库中显示乱码,而查询出来的是正常编码,可以执行:set names 'gbk';
这样在数据库中看到的就会是正常编码
3,如果选择了支持多字符集格式,数据库的编码格式是UTF-8格式,这种情况下,需要在建表的时候指定编码格式,(SHOW VARIABLES LIKE 'character_set%'; 查看mysql当前字符集)
连接字符串设置为:jdbc:mysql://127.0.0.1:3306/abc即可
如果数据库中显示乱码,而查询出来的是正常编码,可以执行:set names 'gbk';
如果这几种情况依然不能解决问题,推荐一种通用格式,就是在插入数据的时候,把汉字进行转化成数据库中对应的格式:
例如查询的时候对汉字使用如下形式的函数:
/**
*iso-8859-1转化成gbk
* */
@SuppressWarnings("finally")
public static final String toChinese(String str) {
if(str==null || str.equals("")){
return "";
}
String strReturn = "";
try {
strReturn = new String(str.getBytes("ISO-8859-1"), "GBK");
} catch (Exception ex) {
System.out.println("ToChinese.toChinese():ex=" + ex.toString());
} finally {
return strReturn;
}
}
在插入的时候使用如下形式的函数
/**
* gbk转化成iso8859-1
* */
@SuppressWarnings("finally")
public static final String toIso(String str) {
if(str==null || str.equals("")){
return "";
}
String strReturn = "";
try {
strReturn = new String(str.getBytes(), "ISO8859_1");
} catch (Exception ex) {
System.out.println("ToIso.toIso():ex=" + ex.toString());
} finally {
return strReturn;
}
}
具体的是iso和GBK之间转化,还是UTF-8和GBK之间的转化,可以视数据编码而定
补充一点:如果在执行数据库操作的时候,出现类似:java.sql.BatchUpdateException: Data too long for column 'name' at row 1的异常,一般情况下,应该是插入的数据的编码,数据库的编码,连接数据库的字符串指定的编码三者之间不统一而导致的