在下载或者页面展示的时候经常会遇到乱码的问题,先总结如下:
首先,设定response的编码方式:
response.setContentType("application/octet-stream;charset=UTF-8");
这个设定的是页面响应的编码方式;
而在html(velocity等)文档中对编码的设置,是告诉页面,以什么样的方式展示所写内容:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
有以上两步了,大家就认为万事大吉了,可以放心的对流或字符进行读写了,其实不然,注意,虽然设定了响应与显示的格式,但是别忘了还有,所写的格式呢,要保证所写的格式与此一致才行。
这就好比,发件人与收收人把发送与接受的方式统一了,但是发送人发送的消息的内容所展现的方式与约定的方式不一致,所以就造成了接收方看到的是一片乱码。
一般,比较常用FileWriter,来写文件,但是他有一个弊端(可查看jdk的API),他采用的是本地的local默认编码方式书写,不可强制定义写的编码方式,即可能会与我们所定义的编码方式一致,这就为乱码留下了隐患:如
FileWriter out = new FileWriter(String fileName);
建议采用它的父类:java.io.OutputStreamWriter 来实现对数据的书写,它可以强制定义书写的编码方式:
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(String fileName),"UTF-8");
这就保证了所写编码与两方约定的编码方式的一致性,从而避免了乱码的出现。