由于本人刚开始接触Java后端,如果有说错的地方,还请大家予以指出批评,谢谢!!!
对于很多初学者来说,中文字符编码不相同的问题,是一个超级烦躁的问题!
因为很多时候都不知道哪些地方出了问题?
其实通过查阅相关资料,我们也很容易发现肯定是三层中的一层没有设置好字符编码,我记得专门我写过一篇关于字符集编码的博客,在此就不介绍gbk和utf-8的编码格式了。为防止乱码,其实我们应该在数据传输和接受的时候设置统一的字符集编码。
而向MySQL中插入中文字符,其实也就三层可能会出现问题:

  1. 前端页面的字符集编码格式没有设置
  2. 后台接收以及发送数据未设置统一的编码格式
  3. 还有就是数据库中的字段编码格式以及数据库默认编码格式等

前端

前端设置就是页面的字符集

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

还有就是在head中也要设置

<meta charset="UTF-8">

后端

一般我们是通过request.getParameter("XXX")的方式获取数据的,但是就算前端页面字符集正确,也有可能在这一层出现问题。
因为传递中文的时候,有可能用UTF-8编码拆解成byte去传递,结果还原的时候使用GBK还原(因为eclipse默认使用GBK的编码格式),这就会导致原来的数据出现乱码或者'???'等问题。因此我们可以利用String里面不同的构造方法来解决这个问题。
这里分两个模块来讲
1)先设置开发工具的编码类型,一般来说默认时GBK,但是这里我用utf-8,所以就得修改,
有两个地方要改:
a.Windows里面的Preference,在general里面找workspace,右侧有text file encoding,改为utf-8(这个时开发ide的字符集修改)
b.鼠标点击你的项目最顶层,然后在project里面找到这个项目的字符编码,改为utf-8(此处修改的时项目的字符集编码)
2)因为我如上所说的问题,所以代码要在获取数据之前指明request和response的编码类型用如下三句代码:

response.setContentType("text/html;charset=utf-8"); 
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

设置好了之后,可以这么获取中文字符

String name = new String(request.getParameter("name").getBytes("utf-8"),"utf-8");

这里第一个utf-8的意思时说明从前端拿过来的byte是utf-8编码格式的,第二个utf-8是指定把我的String字符串转换成什么编码格式。

一般来说使用new String(request.getParameter("name").getBytes(),"utf-8");就可以,尽量避免字符串的编码转来转去,这样会出现效率低下的问题,记得先尝试用最简单的方式获取,然后再后太打印下他的值,用于检查有没有设置成功!

后台代码通过jdbc写Sql将数据传入数据库

以下以MySQL为例,此处有一个比较令人无语的地方就是MySQL的字符集默认设置是Latin1,那么什么是Latin1呢?我在之前的文章也写过,套用百度百科的话就是Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
所以说你的utf-8直接传过来还是会出问题。因此MySQL的url或者xml文件中的配置应该加上字符集的编码

//useUnicode表示允许使用自定义的Unicode 
//characterEncoding是给定自定义的Unicode是什么
String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"

有时候只需要加上?characterEncoding=utf-8这个就行了,之前我写的项目中注册项目,在MySQL数据库中出现了??,我是用这样解决的。因为MySQL解析后台代码传过去的字符串的时候,通过编码类型去解析,所以就显示不出正确的中文!

设置MySQL字符集

在此之前应该分清有哪些可以设置?
1) MySQL的某个库的字符集查看
可以通过use databasename;
先切换到具体的数据库中,再输入show variables like "%chara%";
图片说明
可以用以下命令来进行修改:

set character_set_database="utf-8"
//以此类推,可以修改如下图(或者符合自己的要求即可)

图片说明

然后可能会出现重启完mysql修改的值就失效。可以在my.ini的文件中的[mysqld]标签中设置:
default-character-set=utf8(但是这个是老版本的设置方式,具体什么版本,没测过实在抱歉)
据说新版本是:character_set_server=utf8这个来代替之前的设置(大家可以自己尝试下哪个生效)
设置完之后,mysql重启下,应该字符编码就没问题了

2)MySQL当中,用户所使用的某个数据库的字符集
这个就是创建数据库的时候设置的字符编码
CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
utf8_general_ci是一种校对规则,有兴趣可以自己研究下。
也可以在连接工具上直接编辑数据库,来修改数据库的字符集!

3)某个具体数据库中的某张表的字符集
这个就是创建某张表的时候指定字符编码
CREATE TABLE mytable(
id varchar(40) NOT NULL default '',
userId varchar(40) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
也可以在连接工具上直接改变表,来修改表的字符集!
其实就是把所有能改的地方全部改成utf-8(在数据库中是utf8,没有中间的 “ - ” ,千万别加上去了)

需要注意的是,要学会排错:

  1. 首先是前端传到后台的数据,在后台能正常打印吗?
  2. 其次是后台传输到数据库中的过程有没有问题?
  3. 数据库的字符编码与传进的数据编码是否相同?