做软件开发的同学不论是新手还是那些老鸟都经常会遇到各种各样的乱码问题,本文章就这些乱码问题做一个简单的分析,以帮助大家去理解、处理这些问题。下边分两种情况去分析这种问题。
一、每种软件的默认编码方式不同
1、记事本
记事本是大家常用的软件,也许你会经常听别人说记事本是无编码的,可是你明白记事本为什么是没有编码的吗?
其实是这样的,记事本确实是没有编码方式的,也就是说记事本你写进去什么内容它(记事本)就显示什么内容,这里需要注意的是你写入的内容就是显示的内容,根本原因是因为记事本没有默认的编码方式。
2、EXCEL
EXCEL有自己默认的编码方式(ASCII),注意这里要区分上边的记事本,正因为类似EXCEL这样的软件有默认编码,所以才会产生乱码问题。例如:你用程序往EXCEL中写入UTF-8格式的内容,而你默认打开该EXCEL时它会用ASCII的格式打开,这时用ASCII去读取UTF-8写入的内容就会出现乱码。
二、写入编码格式和读取编码格式不同
为什么要把【每种软件的默认编码方式不同】写在第一条呢,其实这样是想让大家理解不同软件的默认编码方式不同(觉得自己说的这些有点啰嗦),这里要引入的是浏览器,浏览器也是一种软件,也有自己的默认编码方式。下边再分两种情况去介绍。
1、页面访问乱码
如果服务器传回的页面(文件)有编码方式(例如:UTF-8),而页面中这时又没有指定文件内容的编码方式,这时浏览器就会按照自己的默认编码方式(例如:GBK)去读这个UTF-8文件,这时就会产生乱码情况。解决方式就是在该页面文件中指定编码方式。
2、文件下载时名称乱码
大家做文件下载时经常会遇到文件名称乱码的情况,项目中指定的全局的编码方式,页面中同样也指定了相同的编码方式,可是为什么还是会乱码呢,这是因为文件下载时会自动用浏览器的默认编码方式(GB系列)去读取你往浏览器传回的文件名称(往往是UTF-8),所以乱码就产生了,文件下载不同与页面,所以你指定页面的编码方式在这里是不起作用的,解决方式就是把文件名称用GB系列编码方式编码。
3、文件下载时内容乱码
这里举一个容易出错的例子,大家生成一个CSV文件传回到客户端(用流的方式)后,在客户端用EXCEL打开这个CSV文件,往往发现里边的内容是乱码的,这时不论你再后台程序中怎么调试,怎么设置编码它都是乱码的。乱码的根本原因就是EXCEL是有默认编码方式的(ASCII),这里要区分下,EXCELL可以自动识别编码方式,但识别有没有一个标准的类型,而我们的后台应用往往是UTF-8(无BOM(Byte Order Mark))(至于BOM不理解的大家问度娘吧),而EXCEL是用UTF-8(有BOM)方式去读取。解决方法就是往CSV中写入内容时就写入有BOM标识的UTF-8格式:
OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8"); // 要输出的内容 result = (String)contentMap.get(RESPONSE_RESULT); resp.setHeader("Content-Disposition", "attachment;filename=test.csv"); osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF })); osw.write(result); osw.flush();