2024年1月25日发(作者:)
中 文 乱 码
在WEB开发中经常遇到中文乱码问题,现系统说明一下,主要从两个方面:原理 操作。
1. 中文常用编码格式:GBK UTF-8。而一个完整的WEB应用包括DB,持久层,控制层,页面显示层。所以当保持四层中编码格式一致即可解决乱码问题。
2. DB中:以MySql为例
安装时系统默认编码为latin1,将其更改为utf8。
在MySql命令行敲入命令:
mysql>show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:Program FilesMySQLMySQL Server 5.0sharecharsets |
+--------------------------+----------------------------+
在linux下修改的1个/etc/文件(windows是)
找到客户端配置[client] 在下面添加
default-character-set=utf8 默认字符集为utf8
在找到[mysqld] 添加
default-character-set=utf8 默认字符集为utf8
init_connect='SET NAMES utf8' (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)
修改好后,重新启动mysql 即可,查询一下show variables like 'character%';
有上面图的结果就是正确的了。
问题主要出在5个环节
1.
2.
3.
4.
数据库客户端字符集
数据库连接传输字符集
数据库存储字符集
数据库查询结果字符集
5. 数据库启动字符集
如果上述几个编码为latin1,则更改为utf8
mysql>set character_set_XXX = ‘utf8’;
数据库建表:
create database company DEFAULT character set utf8;
DROP TABLE IF EXISTS emp;
CREATE TABLE emp (
id int(12) NOT NULL,
author varchar(200) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注:一般建表语句都写在sql脚本中,在linux系统中可直接在MySql命令行中敲入
source 脚本路径 即可。但当sql脚本中含有中文时,在win系统下建议使用MyEclipse中的DB Browser插件。
3. JDBC/Hibernate:
URL=jdbc:mysql://127.0.0.1:3306/company?useUnicode=true;characterEncoding=utf8
4. 控制层:
racterEncoding ("utf8"); 使request使用指定的编码方式来解码。在所有请求之前。
Tomcat容器:在get请求时需修改中的配置:给Connector添加一个URIEncoding=utf-8。
注:可以通过过滤器实现。
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
racterEncoding("utf-8");
//设置一个响应头,告诉浏览器,应该以什么样的编码方式显示其返回的html。
tentType("text/html;charset=utf-8");
HttpServletResponse resp = (HttpServletResponse) response;
}
racterEncoding("utf-8");
er(req, resp);
一般成熟的框架均有写好的编码过滤器。
5. 显示层:
jsp:
<%@page pageEncoding="utf-8"%>
告诉jsp引擎,在将jsp转换成servlet源文件时,该jsp文件的编码是什么。
<%@page contentType="text/html;charset=utf-8"%>
相当于servlet中的tentType()。即设置http响应头。浏览器会依据该编码来显示页面。保存jsp文件时,其真正的编码应该与设置的一致。
注:建议使用jsp页面。
6. 其他:
MyEclipse中项目存储格式设置为utf8;
浏览器的编码设置为utf8。


发布评论