先上一段代码(上好的代码,多年陈酿)
1OutputStreamWriter osw = newOutputStreamWriter(resp.getOutputStream(), "UTF-8");
2// 要输出的内容
3result = (String)contentMap.get(RESPONSE_RESULT);
4resp.setHeader("Content-Disposition", "attachment;filename=test.csv");
5osw.write(result);
6osw.flush();
问题来了:
在SERVLET中,通过以上代码将内容输出至CSV文件中后,用EXCEL打开文件时,总是产生乱码,但是用NOTEPAD++打开时,显示正常。然后,在NOTEPADD++的“格式”工具栏中查了一下文件编码,发现是“以UTF-8无BOM格式编码”,然后试着将其改为“以UTF-8格式编码”后,再用EXCEL打开时,OK,一切显示正常。那么,这么说明EXCEL是支持UTF-8格式的CSV文件的。同时,也说明,通过以上方式导出的文件中是不含BOM信息的(关于BOM信息请自行谷歌一下)。那么,接下来,为了要让EXCEL正确的显示,要做的事就很明显了----手动的给将要输出的内容加上BOM标识。具体方法如下:
1OutputStreamWriter osw = newOutputStreamWriter(resp.getOutputStream(), "UTF-8");
2// 要输出的内容
3result = (String)contentMap.get(RESPONSE_RESULT);
4resp.setHeader("Content-Disposition", "attachment;filename=test.csv");
5osw.write(newString(newbyte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF}));
6osw.write(result);
7osw.flush();
重点就是上面的红色代码了(即倒数第三行代码),至于为什么要添加这个,只要你自己谷歌过BOM的话,自然就明白了。
另外,如果你使用的是Response的OUT进行输出的话,可以这么搞:
1out = response.getOutputStream();
2//加上UTF-8文件的标识字符
<span style="font-family:"
font-size:13px;line-height:22.1px;"=""><strong><span
style="color:#ff0000;">//加上bom头,才不会中文乱码
</span></strong></span><span
style="color:#222222;font-family:"
font-size:13px;line-height:22.1px;"=""><strong>
</strong></span> out.write(new byte []{( byte ) 0xEF ,(
byte ) 0xBB ,( byte ) 0xBF });
以上来自网页:http://blog.csdn.net/youzhouliu/article/details/52038889
以上操作可能不适合各种各样的操作,不一定完全按照他的方式
总之一个原则,就是写文件时先将new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF }写入到文件中,再写其他的内容,同时要注意其他内容用utf-8编码。
以下是我的代码:
01byte[] bom = newbyte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF};
02file = newFile(fileName);
03
04if(file.exists()){
05 file.delete();
06}
07
08FileWriter fileWriter = newFileWriter(file);
09fileWriter.write(newString(bom));
10writer = newCSVWriter(fileWriter);
11...
12writer.writeAll(allContent);
注意:allContent内容的编码需要是utf-8的,如果不是utf-8,则需要转为utf-8,否则仍然会乱码