在项目开发中,常常会碰见中文字符串乱码出现,好比:从前台传到后台出现乱码,从后台存入数据库出现乱码,从后台到页面展现出现乱码。为了之后避免遇到相似问题,咱们有必要对字符串从页面到数据,从数据库到页面,字符串会通过哪些编码关卡作个整理。html
1.从页面到后台出现中文乱码mysql
从页面提交数据到后台,会存在两种提交方式——get和post。针对这两种提交方式,会有不一样的编码处理过程。linux
get请求,通过Tomcat默认编码(tomcat8以前默认编码是ISO-8859-1,tomcat8以后改成UTF-8)进行前台数据编码,由于tomcat版本不一样,咱们作的操做也不同,那么咱们先说说tomcat8版本以前的作法,首先,咱们在tomcat安装目录下找到sever.xml文件,同时在该文件中找到<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />代码,在该代码中添加一个属性:URIEncoding,将该属性值设置为UTF-8,便可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。修改后的代码:sql
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
post请求,request.getParamter()获取页面数据时,默认以ISO8859-1编码,针对这种状况,为了解决全部页面编码问题,咱们能够写EncodingFilter进行request请求拦截,同时对全部接收的数据进行统一编码设置。关于该Filter的写法,不是此处详解,你们能够自行百度。数据库
2.从后台到数据出现中文乱码vim
一般出现这种状况,多数是因为数据库的问题,由于前台传回来的数据经过上个步骤已经没问题,只要不作特殊处理,就不会出现中文乱码问题,但也有特殊状况,好比我最近碰见的,poi导入excel文件,后台接收时,遍历每行每列数据返回Object类型,须要用String强转存入数据库中,而问题就出如今这里,String存储数据时,若是不指定编码格式,会采用当前系统默认编码方式,据我查阅,windows平台的默认编码方式:gb2312,linux平台默认编码方式:utf-8。怎么去查询两个平台的默认编码。windows
windows下,咱们能够写个demo,代码以下:tomcat
public static void main(String[] args) { Properties p = System.getProperties(); System.out.println(p.getProperty("file.encoding")); }
linux下,经过命令:locale服务器
针对windows平台处理方式:post
new String(((String) Obejct).getBytes(),"utf-8");
这步没问题了,剩下数据库了。在这一步我就碰见了大麻烦,出现的问题:在本地上传excel到数据库(mysql)没问题,而上传linux云服务器上(数据库也是msyql)就出现了乱码,经查阅资料,解决方法以下:
a.查询linux服务器上mysql的数据库默认编码,代码以下:
show variables like 'character%';
效果以下:
b.修改my.cnf文件,代码以下:
vim /etc/my.cnf
效果以下:
在红色框标识的代码下,添加以下代码:
[client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8
重启mysql服务器(linux服务器版本:Centos 7),代码以下:
systemctl restart mysql.service
若是碰见一直没有反应,则先关闭在启动达到重启效果,代码以下:
systemctl stop mysql.service //关闭服务器 systemctl start mysql.service //启动服务器
3.从后台到页面出现乱码
能够在1步骤中的EncodingFilter中添加代码对response编码,示例代码以下:
response.setContentType("text/html;charset=utf-8");