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。

注:可以通过过滤器实现。

OneFilter

Filter

OneFilter

/*

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。