前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法

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

作者头像
felixxue
发布2022-12-29 19:27:42
1.6K0
发布2022-12-29 19:27:42
举报
文章被收录于专栏:xueflyxuefly

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档