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

转码保存后,重新打开即可。

转码操作如下:

编辑器->另存为->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才能真正认清文件里的内容。

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

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文件。

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

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

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

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

            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。修改之后的代码如下:

            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纯属是微软的习惯。

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

解决CSV文件用Excel打开乱码问题的更多相关文章

  1. 如何解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题

    为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符开头.这作为一个”特征符”或”字节顺序标记(byte-o ...

  2. csv 文件用Excel打开乱码

    最近在做一个上传的功能,记录下自己的感受. 刚开始我用的是excel上传:但是发现客户服务器有用64位的,使用的时候程序会报错: 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0” ...

  3. java导出csv文件使用Excel打开乱码问题

    写一个csv文件,发现使用 notpad++ 打开是没有问题的,但是使用 Excel 打开之后显示乱码 刚开始的代码是这样子的: ByteArrayOutputStream os = new Byte ...

  4. 解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题

    在要输出的内容前先输出"\xEF\xBB\xBF", eg:要输出的内容保存在$content里$content = "\xEF\xBB\xBF".$conte ...

  5. PHP生成UTF-8编码的CSV文件用Excel打开乱码的解决办法

    什么是BOM? 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建 ...

  6. PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题

    在你要输出的内容前先输出"\xEF\xBB\xBF",例如:你要输出的内容保存在$content里$content = "\xEF\xBB\xBF".$cont ...

  7. PHP 导出 CSV 文件用 Excel 打开出现中文乱码

    本篇文章由:http://xinpure.com/php-export-csv-file-opened-by-excel-appear-garbled/ 乱码情况 写了一段导出 CSV 文件的代码,可 ...

  8. 解决Arcgis10.2.2中dbf文件用EXCEL打开乱码问题

    1.开始 -- 运行,输入”Regedit“,打开 注册表 . 2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ‘计算机\HKEY_CURRENT_USER\Software\E ...

  9. CSV用excel打开乱码

    utf-8 csv 文件用 excel 打开乱码问题 其实这个问题很久之前遇到过, 应该是没解决, 当时的情况是openoffice打开正常而excel打开不正常, 后来也没解决了, 只能把编码转了. ...

随机推荐

  1. mysql流程控制结构case when

    一.case 使用场景 简单函数 CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement ...

  2. 『学了就忘』Linux基础命令 — 39、挂载U盘和挂载NTFS分区

    目录 1.在Linux系统中挂载U盘 (1)插入U盘 (2)查询U盘设备文件名 (3)挂载U盘 (4)U盘中的中文乱码 (5)U盘卸载 2.在Linux系统中挂载NTFS分区 (1)Linux的驱动加 ...

  3. 动态代理中newProxyInstance中三个参数

     JDK Proxy(代理对象): Proxy.newProxyInstance 方法的三个参数创建代理对象 增强 person对象 使用代理对象代替person 去执行 doCourt方法参数1 类 ...

  4. 生产者消费者模型及Golang简单实现

    简介:介绍生产者消费者模型,及go简单实现的demo. 一.生产者消费者模型 生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.协程 ...

  5. [loj3527]地牢游戏

    当英雄能力值$\ge 10^{7}$时,即能战胜所有敌人,简单预处理即可 若英雄能力值在$[2^{k},2^{k+1})$中,对敌人分类讨论: 1.若$s_{i}\le 2^{k}$,其必然会战胜这些 ...

  6. .NET Core中的鉴权授权正确方式(.NET5)

    一.简介 前后端分离的站点一般都会用jwt或IdentityServer4之类的生成token的方式进行登录鉴权.这里要说的是小项目没有做前后端分离的时站点登录授权的正确方式. 一.传统的授权方式 这 ...

  7. mybatis一对多查询resultMap只返回了一条记录

    问题描述:因为领导的一个需求,需要用到使用resultMap,很久没使用了,结果就除了点意外.就记录下这个问题 准备两个类:author(作者)和book(书),数据库创建对应的author-> ...

  8. 洛谷 P4183 - [USACO18JAN]Cow at Large P(点分治)

    洛谷题面传送门 点分治 hot tea. 首先考虑什么样的点能够对以 \(u\) 为根的答案产生 \(1\) 的贡献.我们考虑以 \(u\) 为根对整棵树进行一遍 DFS.那么对于一个点 \(v\), ...

  9. 使用mamba加快conda安装软件速度?

    conda是个安装软件的神器,但镜像不稳定,下载安装软件的速度有时很慢.对于几十Mb甚至上百Mb的软件往往下不动,下了半天可能失败. 找了一个叫mamba的加速神器,可以用来并行下载和安装,大大加快速 ...

  10. 【R shiny】一些应用记录

    目录 DT和downloadButton应用 downloadButton 中验证结果输出 添加进度条 如何确保仅在使用Shiny按下操作按钮时才触发操作 其他 DT和downloadButton应用 ...