最近在用springboot去做一个自动发送邮件报表的功能,其中邮件报表内容我是用html页面的形式去做的。在功能开发过程中,我一直用的是springboot内置的tomcat去启动项目,在项目结尾的时候,因为后期要到测试环境,线上环境,为了有更好的迁移性,我就用本地的tomcat去启动项目先调试一下。不起不知道,一起一懵逼,在我调用完发送邮件的方法后,原本在使用springboot内置tomcat启动项目一切发送正常的情况下,用外置的tomcat启动项目调用接口实际接收到的邮件中的中文竟然乱码了,这就有点尴尬了。
对于这个问题我先寻摸了一下广大网友有啥高见。我发现博客上说什么的都有,但是真正解决了问题的不是很多。
我认为对于这个问题我们应该先找到在哪个过程中出现的乱码,一般出现这种乱码的我们可以从以下几个方面考虑。
(1)原文件的类型是什么编码的utf8还是gbk...
(2)我们采用的文件读取方式是以什么形式去读取的。
(3)网页在解析的时候是用的什么编码去做的解析。
针对以上几种情况,我们可以去这样排查问题。
(1)对于文件我们可以用工具去验证以下,用notepad++编辑器通过不同的编码去打开文件可以去判断,一般是utf-8或者gbk,如果你非得弄了个DOS啥的编码类型,那随你高兴就好,一般没那么大偏差的。我们可以用不同的编码格式去打开这个文件,如果于文件不同的编码会乱码,相反则正常不会乱码。
(2)讲到第二种的查错也正好是我出现问题的地方,我的文件我已经确定了是utf8编码的,代码我先用的是FileReader去读取的文件,我将读到的字符串打印出来出现了乱码,我把乱码的字符串跟用编辑器以GBK编码打开的文件对比,发现乱码字符是一样的。可能这个类用外置tomcat去启动项目去读文件默认是用GBK读的吧,当时我用springboot内置的tomcat去启动项目以同样的方式读取文件而没有出现乱码的情况,感兴趣的可以自己在查一下。针对这个问题我给它在读取的时候指定了一下字符集,问题解决了,在这儿还有人说修改tomcat中文件的,对于这种情况小编没试,担心自己一不下心把tomcat弄残了,如果对tomcat熟悉的不妨试一试,个人不建议去修改tomcat中的代码,穷途末路可能也是一种方法。
//修改过的代码
fileInputStream = new FileInputStream("D:\\workspace\\company\\eco-data-search\\data-search-web\\src\\main\\resources\\mail\\umpData.html");
fileReader = new InputStreamReader(fileInputStream, "UTF-8");
//原码
// fileReader = new FileReader("D:\\workspace\\company\\eco-data-search\\data-search-web\\src\\main\\resources\\mail\\umpData.html");
(3)针对第三种,我们在浏览器中将html文件打开去检验一下就可以了,非utf8格式会乱码,大家在代码中加入以下这一行设置以下浏览器解析的编码集就可以:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
如果是jsp文件也可以用以代码来指定字符集:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>