1、问题描述
后台往前端输出流中没有指定编码,所以会默认使用浏览器本身的编码。移动端的主流浏览器不会像pc端一样自动进行编码转换,所以当文本的编码是utf-8的时候会显示正常,但是当编码为GB2312或ANSI时,显示为乱码。附件为几个不同编码的文本
使用notepad++打开右下角会显示具体编码:
2、解决方案
2.1、判断数据流的编码
参考下面这篇文章:
https://blog.csdn.net/qq_33854869/article/details/77159239
我们使用tika来进行流的编码判断,需要注意引用的包:下面红颜色的包一定要引用,否则会报错。
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.22</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.22</version>
</dependency>
Tika对流的编码的判断需要对流进行读取,但是InputStream是单向读取的,也不能reset,所以需要将流复制一份,原始的流继续做操作。不这样做的会导致因为流指向最后一位,最后下载的文件都是空文件。
2.2、设置返回流的编码
通过2.1的方式对流进行处理以后会有个bug,比如文件类型是ANSI,但是会显示KOI8-R编码,但是对UTF-8的判断是准确的,为了简化操作,只要流的编码是以UTF开头的,一律为UTF-8,否则为GB2312。至于别的编码,暂时不考虑,如果以后有用到再进行扩展。