做软件开拓的同学岂论是新手照旧那些老鸟都常常会碰着各类百般的乱码问题,本文章就这些乱码问题做一个简朴的阐明,以辅佐各人去领略、处理惩罚这些问题。下边分两种环境去阐明这种问题。
一、每种软件的默认编码方法差异
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();