引言
在平常我们开发的过程中,可能会遇到各种各样的问题,其中中文乱码问题是最普遍最麻烦的,因为寻常的中文乱码会有各种形式,有前端原因,也有后台原因,所以需要具体问题具体分析。下面将从几个常见乱码问题入手,分析其原理,给出解决方案,以便到后续开发中能够尽量避免此问题的发生。
目录
引言
一、问题阐述与分析
1.1 IDEA控制台乱码问题
1.2 页面乱码问题
1.3 前台参数乱码问题
1.4 数据库插入乱码问题
1.5 服务器乱码问题
1.6 CSV等文件中文乱码问题
1.7 URL中文乱码问题
二、解决方案原理分析
2.1 IDEA控制台乱码问题解决
2.2 页面乱码问题解决
2.3 前台参数乱码问题解决
2.4 数据库插入乱码问题解决
2.5 服务器乱码问题解决
2.6 CSV等文件中文乱码问题解决
2.7 URL中文乱码解决
三、实践
3.1 IDEA控制台乱码问题实践
3.2 页面乱码问题实践
3.3 前台参数乱码问题实践
3.4 数据库插入乱码问题实践
3.5 服务器乱码问题实践
3.6 CSV等文件中文乱码问题实践
3.6 URL中文乱码问题实践
四、结论
一、问题阐述与分析
因为乱码问题内容比较多,而且不同的乱码问题可能的原因也有许多,这里将从以下几个问题分析:
- IDEA控制台乱码问题
- 页面乱码
- 前台参数乱码
- 数据库插入乱码
- 服务器乱码配置
- CSV等文件中文乱码
- URL中文乱码问题
在开始分析这些问题之前,我们先要了解乱码产生的真正原因,因为世界上语言有很多种,每种语言要输入到计算机中,就要遵循某种编码格式,编码格式中,一般字符与编码是一一对应的,如果将文本与其原本编码不符的编码格式做对应时,就会导致乱码,比如在UTF编码中的“一”在GBK编码后的字符为“涓�”,下面列举了常见的乱码字符,以及引起乱码的原因:
我们遇到这种情况时,可以按照上述方法将编码改正确,可以使用下面的java代码修改字符串的编码:
需要注意的一点是,一旦修改编码后发现并不是自己想要的内容后,一定要先修改回去原来错误的编码,然后在对其他编码格式一一尝试,因为修改编码是在原本的基础上进行重新编码,如果直接修改的话,乱码所对应的真实意义也因为第一次修改被改变了,所以在修改过后的字符上再做操作是没有意义的,只会越改越乱,最后找不到一开始的乱码信息,所以做还原操作是非常有必要的。
在了解这些基础内容后,接下来对上面的问题一一分析。
1.1 IDEA控制台乱码问题
IDEA的控制台是我们开发人员经常查看的版块,我们注意的内容的输出、流程导向等数据如果一旦显示成乱码内容,对我们的开发是非常不利的,我们无法通过控制台查看输出内容,尤其是我们的项目再接上log4j后,日志输出内容变多,我们想要查看的内容也变多比如执行mybatis时输出sql语句以及参数就是非常重要的内容,可以及时到数据库中验证sql语句是否正常(sql语句在大型项目中可以做的工作有很多,而且sql语句的体量会非常庞大),因此我们需要首先解决此问题。
问题分析可能原因有IDEA自身设置编码问题、IDEA控制台显示编码问题,也可能是服务器编码设置有问题。
1.2 页面乱码问题
页面乱码在开发中我们也可能遇到,这个问题其中又包含了俩种页面乱码问题,第一种就是前台页面的显示乱码,如html、jsp页面编码设置问题。第二种情况就是我们在后台拼接或是打印到前台页面显示乱码问题。这俩种虽然引起乱码方式不同,但是在显示效果上都是直观的页面乱码。
引起前台页面乱码的第一种情况是因为页面指定编码不正确。第二种情况就是后台的响应Response编码没有设置或者是设置不正确。具体问题具体分析。
1.3 前台参数乱码问题
我们在前台提交表单的时候,可能会遇到输入汉字传到后台乱码的问题,在提交表单时往往与数据库内容不正确而导致查找失败。分析原因可能是因为request请求编码没有设置或者是设置不正确。后面会具体介绍解决方案。
1.4 数据库插入乱码问题
在将数据插入数据库的时候,也可能遇到乱码问题,这其中有俩种可能导致乱码的情况,第一种就是前面参数乱码的问题,因为插入时数据已经乱码,所以数据库也只是实际插入内容。第二种情况就是数据库编码没有设置或者是设置不正确。即数据插入时正常,插入后乱码。第三种情况就是连接数据库时没有指定数据库的编码而导致插入乱码,以上这三种情况会在后面进行详细分析。
1.5 服务器乱码问题
我们在启动服务器时,有时候控制台乱码问题不仅仅是IDEA编码设置问题,也可能是服务器的编码设置不正确。在实际部署项目时,我们更多的是将项目打包扔到服务器上,然后服务器启动黑窗口进行项目启动,这时如果有乱码的话就会在黑窗口上显示,所以我们在配置服务器时也要做好指定编码的工作。
1.6 CSV等文件中文乱码问题
在实际项目中,我们可能需要导入某个文件进行分析,如CSV、TSV、EXCL,这时IDEA的编码设置不正确也会导致乱码,这种情况解决较为方便,后续会给出解决方案。
1.7 URL中文乱码问题
在做web项目的过程中,我们可能会使用get方式往后台传输汉字时我们获取到的数据乱码,分析原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的。所以需要配置服务器编码,到这里和上面的问题一致,然后就是针对post请求时,我们也可能会获取到乱码的内容,针对这个问题,我们也会对项目做相应的配置。具体实现方法参考下文。
二、解决方案原理分析
2.1 IDEA控制台乱码问题解决
首先在出现控制台乱码问题后,首先想到的是设置IDEA的默认编码,在File-->Settings-->Editor-->File Encodings中查看当前默认编码,将编码改为UTF-8.
第一部分是设置全局编码,第二部分是设置项目编码,底下是设置配置文件的编码格式,我们还可以根据项目路径,针对需求设置不同的编码。
做完这些内容后,再次启动服务器,发现控制台中文内容还是乱码,这时想到还没有设置IDEA的默认编码,打开help-->Edit Custom VM Options,在文件最下面加入-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8这两行,其中第一行是设置IDEA的默认文件编码格式为UTF-8,第二行设置IDEA的console窗口的默认编码格式为UTF-8,第二行设置的内容是最为核心的。
这时再启动服务器,这时服务器启动内容已经没有乱码了。
2.2 页面乱码问题解决
页面乱码问题上小结分析原因有俩种情况,情况一是页面本身未指定编码格式,情况二是后台向前台打印页面内容乱码,下面我们给出俩种情况的解决方案。
情况一:设置页面的编码格式,常见前台页面设置,首先是jsp页面,在jsp页面最上方加入<%@ page contentType="text/html;charset=UTF-8" language="java" %>,指定默认编码为UTF-8格式。其次是html页面,在head标签中加入<meta charset="UTF-8">,指定默认编码为UTF-8格式。
情况二:在往前台打印网页是,首先设置response的编码格式,因为我们在打印页面用到的PrintWriter是通过response获取到的,设置编码的方式response.setContentType("text/html;charset=utf-8");
指定response为文本模式,并且默认编码为utf-8,接下来再次启动服务器访问页面,显示内容就为正常了。
2.3 前台参数乱码问题解决
通过表单传输到后台的数据乱码的原因是request请求没有设置编码,我们在拿到数据后首先设置request编码为utf-8,代码如下:request.setCharacterEncoding("UTF-8");接下来再次启动服务器访问页面,显示内容就为正常了。
2.4 数据库插入乱码问题解决
上小结中,我们分析了数据库插入中文以及中文内容显示乱码的问题,可能存在三种情况导致数据库乱码,情况一是数据在插入数据库时已经乱码,解决方案可以参考2.3前台参数乱码问题解决这个小结的内容,这里不再赘述。
情况二是数据库的编码设置不正确,或是没有设置编码,我们在创建数据库时,应该选择字符集为utf8,对应的mysql语句为:create database 数据库名 character set utf8;对于已经创建的数据库,也可以使用命令更改其编码。对应mysql语句如下:alter database 数据库名 character set utf8;
使用Navicat图形化界面操作数据库编码更为简单,下面是创建数据库和修改已有数据库的方法:
情况三是连接数据库没有设置对应的编码格式,当我们打开jdbc.Properous配置文件时,jdbc的路径在选择了数据库名后,还须指定编码格式,这里如果不设置的话也可能导致传输中文数据时传递乱码信息。具体实现方法如下:
2.5 服务器乱码问题解决
在实际应用场景开发的过程中,我们要上线的程序是在单独的服务器上运行程序,这时就要求在上面部署的服务器一般不能随意停止运行,我们在线上调试唯一需要能够知晓项目运行情况的就是通过项目所打印的日志,所以要确保日志内容不能乱码,所以我们在服务器设置中要配置编码格式,具体操作步骤是打开Tomcat-->config-->service.xml配置文件,找到配置端口的标签,在后面添加编码格式为UTF-8,如下图:
同样,在本地IDEA调试过程中,我们也可以在tomcat配置中添加参数以实现相同功能,具体操作如下:
2.6 CSV等文件中文乱码问题解决
在项目运行时,我们可能还会导入外部文件,这时极小部分可能会导致文件打开轮码,这里的问题同样可以参考2.1小结设置项目编码的问题解决,同时也可直接通过下述方法直接解决,在IDEA右下角的编码,可以直接设置,设置完成后点reload重新加载,一般就会解决问题,同时要注意转编码的问题,如果一次转不成功,要返回原编码,在此基础上重新选择编码,具体操作方法如下:
2.7 URL中文乱码解决
URL访问路径中文乱码问题主要包含俩种内容,第一种就是当我们使用get请求时url传递参数中文乱码,这个问题上面已经解决,这里不在赘述。第二种情况就是post请求时中文乱码,这里我们可以配置项目的web.xml文件,添加一个拦截器,将所有访问内容的编码设置成UTF-8,以实现访问post请求中文乱码的问题,具体实现代码如下:
三、实践
3.1 IDEA控制台乱码问题实践
将上问题按步骤执行下去,我们可以看到启动服务器文字内容正常。
3.2 页面乱码问题实践
将上小结的解决问题的步骤执行后,我们访问页面中文显示正常,而且从后台打印到前台的内容也显示正常,说明分析实际思路成功。
3.3 前台参数乱码问题实践
将上小结介绍的request编码加上后,使用from表单传输的中文内容显示正常,登录成功。
3.4 数据库插入乱码问题实践
将上小结介绍的避免插入数据库的中文内容乱码的方法进行改正后,运行程序登录后,插入数据库日志时,username一栏能够正确显示,表明问题已解决。
3.5 服务器乱码问题实践
将上小结介绍的内容配置服务器编码后,在启动tomcat-->bin-->startup.bat服务器后,中文内容显示正常,表明问题已解决。
3.6 CSV等文件中文乱码问题实践
将上小结介绍的内容配置后,我们可以看到原本乱码的文件立刻变不乱码了,说明实践成功。
3.6 URL中文乱码问题实践
将拦截器配置后,post请求获取的中文数据不乱码,表示实现成功,这里使用postman模拟测试。
四、结论
综上所述,我们在日常开发的过程中可能会遇到各种各样的乱码问题,但其实分析其原理,找好对策,就能够比较容易的解决,我常见到的中文乱码的问题以及解决方案都已列出,感谢大家点评。此文档既是我的软件管理期末作业,也是日后查漏补缺的手账。也是本人将近四年的java学习开发暂时道个别,下学期将去实习人工智能岗,未来工作谁又能说的上呢?