JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法

先上一段代码(上好的代码,多年陈酿)

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文件的标识字符

font-size:13px;line-height:22.1px;"="">

style="color:#ff0000;">//加上bom头,才不会中文乱码

style="color:#222222;font-family:"

font-size:13px;line-height:22.1px;"="">

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,否则仍然会乱码

你可能感兴趣的:(JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法)