1、JSP显示中文乱码的问题,一般都是没有设置页面编码,注意添加以下这样一段代码
<%@ page pageEncoding=”UTF-8”%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
"pageEncoding"指定了当前jsp文件存储使用的编码方式,“contentType”用来指定响应头消息中的"Content-Type"
当服务端的响应头消息中没有指定charset时,客户端会依据上面代码中的charset指定的编码方式解码页面
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
并且JSP都以UTF-8的编码方式保存,把所有可能出现的问题通通抹杀。如果你使用Myeclipse,可以设置Myeclipse的默认参数, 使Myeclipse新建JSP文件时,可以自动是用UTF-8的编码方式。方法:Windows-Preference-Myeclipse-File and Editor-JSP- Encoding,选择ISO 10646/Unicode(UTF-8)
2、存储数据,MySQL表的编码设定,最好指定相应的编码格式。字符集选择utf8,校对utf8_unicode_ci。
安装MySQL时,会提示使用什么样的默认编码,当然也可以自己设定
修改 my.ini(MySQ安装目录下的文件)
# CLIENT SECTION
[client]
port=3306
[mysql]
default-character-set=utf8
# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=utf8
修改完毕后,务必记得重启MySQL!!!
重启MYSQL方法:
win+R,
输入命令:
net stop mysql
net start mysql
设置成功之后是显示这样
- mysql> show variables like "%char%";
- +--------------------------+---------------+
- | Variable_name | Value |
- +--------------------------+---------------+
- | character_set_client | gbk |
- | character_set_connection | gbk |
- | character_set_database | utf8 |
- | character_set_filesystem | binary |
- | character_set_results | gbk |
- | character_set_server | utf8 |
- | character_set_system | utf8 |
- +--------------------------+-------------+
修改这个文件,是我设置了CharacterEncoding、指定了页面编码、并且使用了过滤器依旧无法解决问题,最后没办法了只能通 过这个方法
3、读取数据时,在Servlet中添加request.setCharacterEncoding("UTF-8");可以很好地解决从JSP页面接受中文参数乱码
4、使用过滤器,如果在MySQL默认编码格式为UTF-8的情况下,只使用过滤器,便可以解决一切问题,无论你有没有设置那些繁 杂的编码。
在包中建一个class:CharacterEncodingFilter
package com.rady.blog;
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 CharacterEncodingFilter implements Filter {
private FilterConfig config;
private String encoding = "UTF-8";
public void destroy() {
config = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
this.config = config;
String s = config.getInitParameter("encoding");
if (s != null) {
encoding = s;
}
}
}
在web.xml中添加
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.blog.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.修改Tomcat安装目录/conf/server.xml文件
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
6.设置URL: (这是最关键的一步)
jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=UTF-8
后面“?”之后的代码一定要有的。
7.当以上方法全都无效的时候,(我不幸的遇到了),当时大杀器第五个方法设置后以下三个的值没有变化
character_set_client
character_set_connection
character_set_results
在console中输入set names utf8 这句话可以将其改变,但是只是临时的,没办法只能在数据库连接的时候
在其下输入代码
PreparedStatement p = conn.prepareStatement("set names utf8");
p.executeUpdate();
public class DBManager {
public static Connection getConn() {
final String driverClass = "com.mysql.jdbc.Driver";
final String connStr = "jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8";
final String user ="root";
final String pass = "root";
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(connStr,user,pass);
PreparedStatement p = conn.prepareStatement("set names utf8");
p.executeUpdate();
if (conn != null)
System.out.println("数据库连接成功!");
else
System.out.println("数据库连接失败!");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
最后历尽千辛万苦终于解决了这个问题,希望以上的方法能帮助到各位了。