Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >「问答」解决CSV文件用Excel打开乱码问题

「问答」解决CSV文件用Excel打开乱码问题

作者头像
毛大姑娘
发布于 2020-09-10 07:22:21
发布于 2020-09-10 07:22:21
2.2K00
代码可运行
举报
文章被收录于专栏:向全栈出发向全栈出发
运行总次数:0
代码可运行

这篇文章适合有一定编码基础的人看,纯手动解决乱码问题请参见:

转码保存后,重新打开即可。 转码操作如下: 编辑器->另存为->ASCII码格式文件/UTF-8含BOM格式->保存。

参考文章:https://blog.csdn.net/m0_37125796/article/details/73928157

我写了一个CSV文件的数据列表,用Excel打开之后发现全部乱码了,这让我很尴尬。

于是找到了上面这篇文章,参照他的方式,进行了一些修改,终于解决了这个问题。

解决办法:给CSV文件添加BOM头

什么是BOM?

简单来说,它是一个可以证明内容以什么编码格式存在的中间人。

Excel是ASCII码格式文件,而CSV文件是UTF-8格式。如果不进行兼容,这两种不同格式肯定没法正常展示的。

所以,我需要对UTF-8编码的CSV文件写入一个UTF-8的BOM头,告诉Excel“我是UTF-8编码的,你要按照我的编码格式来解析。”这样,Excel才能真正认清文件里的内容。

上面的参考文章给出的解决方案如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();  

我兴高采烈地依葫芦画瓢,把我的代码成他那样,而且在我的mac电脑上已经运行成功了,Excel可以正常打开我的CSV文件。

于是,我兴高采烈地交货了,把我的成品发给了老大,让他检阅。

谁知,老大给我的答案是:“打开都是乱码。”

“怎么可能,我在我电脑上能打开啊!”我下意识地反驳了一句,后来想想好傻啊,难不成是老大骗我吗,还不赶紧去检查代码!

我带着疑问,老大也过来帮我看哪里出了问题,先上一段我修改前的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            FileOutputStream fos = new FileOutputStream(file);
            OutputStreamWriter osw = new OutputStreamWriter(fos);
            osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));
            osw.write(s);
            osw.flush();

我按照参考的文章写了这代码,看起来好像没什么问题。但是老大看出了猫腻,他把文件以16进制格式打开,发现我的BOM头是EF BB 3F,而我写入的BOM是EF BB BF。为何有这样的差异,我的BF怎么变成3F了?

因为只有EF BB BF才能表示UTF-8,所以差一个字母都不行。

老大怀疑问题出在osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));上,String默认是UTF-16的编码,而我们写入时应该不带任何格式,才能让解析器读懂,如果被String这么一转,转成其他格式,这就不好说了。

不愧是老大,一语中的!

于是,我尝试把String去掉,直接写入byte数组的BOM。修改之后的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
            OutputStreamWriter osw = new OutputStreamWriter(fos);
            osw.append(s);
            osw.flush();

原来的osw.write()也改成了osw.append()。(这个不改也无碍)

最终运行结果是可喜的,可以成功打开。

其实我们两个电脑之间的差异,一个是windows,一个是mac。我怀疑是mac对BOM做了兼容,检查没有windows严格。后面我一查,其实UTF-8本身没有BOM,给它加上BOM纯属是微软的习惯。

说了这么多,你是不是有点迷糊呢?其实,我也迷糊,所以我要继续去补知识了,拜~

欢迎留言留下你的问题。

我是毛毛,感恩遇见你。

(2019-01-29 00:54)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年01月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法
1OutputStreamWriter osw = newOutputStreamWriter(resp.getOutputStream(), "UTF-8"); 
felixxue
2022/12/29
2K0
java怎么解决导出csv文件乱码
将查询的数据以xls文件导出时(UTF-8编码),数据正常;但以CSV文件导出时,文件中的中文乱码,同样是UTF-8编码,改成GBK编码导出时,中文显示正常。
Java架构师必看
2021/12/21
4.7K0
csv文件乱码
问题描述: 生成的csv文件,设置为UTF-8格式,在windows上用EXCEL打开的话会乱码,在linux上用vim或者cat打开查看正常;设置为GBK格式的话,在windows上用EXCEL打开正常,但在linux上乱码 解决方法: 在csv文件头部的最前面加bom BOM(Byte Order Mark),是 UTF编码方案里用于标识编码的标准标记,在 UTF-16里本来是 FF FE,变成 UTF-8就成了 EF BB BF。这个标记是可选的,因为 UTF8字节没有顺序,所以它可以被用来检测一个字
千往
2018/01/24
2.9K0
csv文件导出注意事项
默认情况下,在windows上用excel打开csv文件时,并不是按utf-8码解析的,就算代码里设置了写入字符串为utf-8字符集,也可能乱码。
菩提树下的杨过
2020/06/24
1.5K0
Java杂谈之BOM谜题
开发中做了一个导出CSV功能,本地通过wps测试都没有问题,但是测试人员测试的时候发现用excel打开中文表头会出现乱码现象,很奇怪的现象,用nodePad工具打开看也是正常的,但是用excel打开就是中文乱码,通过查找资料了解到是因为csv文件是utf-8编码的,但是没有增加bom头,这样就会导致在window环境下一些软件会用默认编码打开文件从而导致乱码问题,本文详细介绍从前端下载、后端读写如何解决该问题。
你呀不牛
2021/05/28
1.7K0
我也太牛了,解决了浏览器中,前台导出csv格式,UTF-8编码,且excek打开不乱码!
ExcellentExport.js的方法,利用base64下载文件。支持chrome ,opera,firefox. 于是决定拿来为我所用!
申君健
2018/09/21
5.1K0
WEB:字符集、编码、乱码 —— 看这篇就够了
ASCII(美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,是现今最通用的单字节编码系统。
WEBJ2EE
2019/07/19
4.3K0
WEB:字符集、编码、乱码 —— 看这篇就够了
C#自动识别文件编码
在做导入微信商户后台退款数据时,无论怎么设置编码导出来都是乱码,后来在网上找了这个识别文件编码的代码,感觉不错。 最后识别出来是gb2312,看来我还是太渣了,只能吃土了,竟然忘记了这个编码。 下面,上代码。 1 /// <summary> 2 /// 用于取得一个文本文件的编码方式(Encoding)。 3 /// </summary> 4 public class TxtFileEncoder 5 { 6 pub
晓晨
2018/06/22
2.2K0
PHP file_get_contents 中文乱码解决方案记录
最近拉取了京东结算订单csv文件,结果发现在用file_get_contents获取内容的时候,中文出现了乱码,感觉京东这么大,这个技术问题他们帮忙解决才好吧,想想还是算了,自己动动手的问题。
猿哥
2019/08/06
3.6K0
PHP file_get_contents 中文乱码解决方案记录
win10 uwp 读取文本GBK错误
本文讲的是解决UWP文本GBK打开乱码错误,如何去读取GBK,包括网页GBK。最后本文给出一个方法追加文本。
林德熙
2018/09/18
1.4K0
把一个txt文件转化为带标题栏的Excel文档
public class Export { public static final String CSVNAME_COMPETITION="cpc.csv"; } public class CSV { public static final String ENDLINE = "\n"; public static final Map<String,String> HEADLINES=new HashMap<String,String>(); static{ //分别是Excel文档的第
用户5166556
2019/04/16
7550
[精选] PHP如何快速导出 百万级数据 到EXCEL
很多时候,因为数据统计,我们需要将数据库的数据导出到Excel等文件中,以供数据人员进行查看,如果数据集不大,其实很容易;但是如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百万条数据为例,导出时间不过20秒,值得学习的一种大数据导出方式。
码农编程进阶笔记
2022/05/24
2K0
解释BOM头和去掉方法
类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。
用户7657330
2020/08/14
1.1K0
java中IO写文件工具类
下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂。 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的。 /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static Fi
用户5166556
2019/04/16
8750
Java进阶-IO(2)
话接上回,继续java IO部分的学习。上一次说完了字节流的读写数据,这次介绍一下字符流的读写数据。
reload
2024/03/03
2120
PHP Bom头导致乱码或者其他错误
转载至:https://www.cnblogs.com/wt645631686/p/6868826.html
黄啊码
2020/05/29
1.1K0
Java基础-21(01)总结字符流,IO流编码问题,实用案例必做一遍
1:字符流(掌握) // 字节流读取中文可能出现的小问题(所以用字符流输入输出中文) package cn.itcast_01; import java.io.FileInputStream; import java.io.IOException; /* * 字节流读取中文可能出现的小问题: */ public class FileInputStreamDemo { public static void main(String[] args) throws IOException { // 创建字
Java帮帮
2018/03/16
1.2K0
java基础io流——字符流的变革(深入浅出)
在io流里,先诞生了字节流,但是字节流读取数据会有乱码的问题(读中文会乱码)。比如:
100000860378
2018/09/13
5200
java基础io流——字符流的变革(深入浅出)
转换流实现了字节流和字符流之间的互相转换_java输出流输出文件
转换流也是继承自超类Writer,因此可以使用Writer中的共性方法:write(int c),write(char[] ch),…,flash(),close(),…
全栈程序员站长
2022/10/03
4280
转换流实现了字节流和字符流之间的互相转换_java输出流输出文件
&#65279导致页面顶部空白一行解决方法
模板文件生成html文件之后会在body开头处加入一个可见的控制符&#65279,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
OECOM
2020/07/01
1K0
推荐阅读
相关推荐
JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验