前言
前两天在把一个小Java Web项目部署到实验室的服务器上时,出现了一个比较蛋疼的问题——搜索栏中文查询无结果。
我当时就惊了,明明各个地方都加编码格式声明了啊,怎么会这样?
结果折腾了很久,从浏览器到数据库查了一遍,最后发现是数据库连接串少了编码配置。。。
真想给自己一巴掌ヽ(`Д´)ノ︵ ┻━┻。
那么既然当时查了不少资料,索性总结一下,以后好提醒自己。
更新
2017.09.22 - 创建文章。
方法总结
浏览器页面编码更改
部分情况下,我们在浏览页面的时候,可以通过浏览器编码配置来解决乱码问题。
以Chrome为例,对于浏览器版本在 V55 之前的使用者,可以在Chrome设置中直接更改编码格式。
但是!Chrome在 V55 之后的版本取消了这一功能,理由是使用率较低,促进网页编码规范(我信了o(╯□╰)o~~)。所以如今的Chrome想要更改页面编码格式需要安装扩展程序才行。
下面就以某一款编码扩展程序来举个栗子:
1.打开Chrome网上应用店(自备膜法上网);
2.搜索Set Character Encoding,安装(或者别的编码扩展);
3.安装之后,在任意页面右键可见到Set Character Encoding的选项,悬浮即可选择编码格式。
评价:非开发问题,访问某页面出现乱码的时候可以用用。
Tomcat编码配置
由于Tomcat的自带编码不兼容中文,所以有的时候,在不声明页面编码的情况下,更改Tomcat配置能够解决部分中文乱码问题(当然,后台也是要改的)。
1.打开tomcat根目录-->conf-->web.xml,找到下面内容:
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
一般是被注释掉了,取消注释。如果没找到就自己加上。
2.打开tomcat根目录-->conf-->server.xml,找到下面内容:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
如果没有URIEncoding="UTF-8"就加上。
这样应该能解决一部分中文乱码问题。
评价:不建议开发时使用,可能会影响其他项目。
MyEclipse中编码格式配置(顺便总结)
如果使用IDE来进行开发,最好是对IDE的默认编码格式进行设置,避免一些不必要的麻烦。
下面以MyEclipse为例,设置全局默认编码格式:
1.打开Window-->Preferences-->;
2.依次点击General-->Workspace,在右侧会有Text file encoding,根据需要修改;
3.或者,对某一类文件设置默认编码格式,依次点击General-->Content Types,在右侧树状图选择对应文件,在下方输入对应编码,点击Update更新。
如果已存在的项目需要更改编码格式,可以右键项目或源码文件,依次点击Properties-->Resource,在右侧会有编码设置选项。
评价:建议设置。
JSP编码配置
如果使用像MyEclipse这样的IDE创建jsp文件,IDE会自动把下列代码加入(基于你的IDE默认编码):
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<meta charset="utf-8">
如果你想手动添加,可以使用以下代码:
<%@ page pageEncoding="UTF-8"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
其中,contentType的默认类型值即是“text/html”,可以省略,但charset必须设置,因为默认字符编码方式是“ISO-8859-1”。
评价:必加。
Servlet编码配置
同上,如果你使用IDE,新建文件时会自动加上下面这几行代码,你也可以手动添加(或更换代码位置,在doGet或doPost中):
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
评价:必加。
SQL连接串编码配置
在此,先再抽自己一巴掌ヽ(`⌒´メ)ノ。
然后请注意下面代码中的url连接串中的** ?useUnicode=true&characterEncoding=UTF-8 **,我就把这段忘了。
public static Connection getConnection(){
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/O_x?useUnicode=true&characterEncoding=UTF-8";
String username = "root";
String password = "123456";
Connection connection = null;
try {
Class.forName(driver);
connection = (Connection)DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
评价:虽然在我的机子上没加依然没问题,但开发的时候不知道会部署到什么设备上,建议还是加上好。
数据库编码配置
以MySQL为例:
如果你使用MySQL Command Line,请用下列语句设置编码(创建库、创建表、修改库、修改表、修改字段):
create database test character set utf8;
create table test(id int primary key)DEFAULT charset=utf8;
alter database test character set utf8;
alter table test character set utf8;
alter table test modify col_name varchar(50) CHARACTER SET utf8;
如果你使用数据库管理工具,如Navicat或Workbench等,在进行创建或修改操作时有非常明显的编码设置提示,在此不予赘述。
评价:必设。
参考与致谢
感谢以下文章及其作者的帮助(顺便厚着脸皮贴下自己的博客)。
可随意转载,但请注明出处,谢谢。
参考
bestcxx - tomcat服务器配置字符集为utf-8-彻底解决中文乱码问题
LPF - MyEclipse编码设置及设置单个项目的编码
XinVSYuan - JSP中的编码设置
javaweb向数据库写入mysql数据出现中文乱码
Pinnsvin - MySQL字符编码设置方法