CSV Excel乱码问题 和 BOM标记

CSV Excel乱码问题 和 BOM标记

背景

在使用Java代码生成csv文件时,使用Notepad++/Sublime Text之类的文本编辑器打开是没有问题,但可视化效果不好,故而考虑使用Excel打开,可是却出现乱码问题。

注:后来在启动一个应用时,也遇到也个乱码问题,参考IDEA + Tomcat 8.5中文乱码解决过程,是某个HTML文件的编码问题。

BOM,Byte Order Mark,字节顺序标记,一种文件头部协议,存储在文件头部,用于标识文件编码。

BOM,是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是 FF FE,在UTF-8就变成 EF BB BF 。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。

微软在自己的UTF-8格式的文本文件之前加上 EF BB BF 三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的,这只是微软暗自作的标记,其它平台上并没有对UTF-8文本文件做个这样的标记。

一个UTF-8文件可能有BOM,也可能没有BOM,区分的三种方法:

  • 用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF
  • 用Dreamweaver打开,察看页面属性,看包括Unicode签名BOM前面是否有个勾
  • 用Windows的记事本打开,选择 "另存为",看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。
  • 如果使用UTF-8编码生成CSV文件,会发现CSV文件虽然可以用记事本打开,但是用Excel打开就会出现乱码。

解决

原理:Excel在读取csv时是通过读取文件头上的bom来识别编码的,如果文件头无bom信息,则默认按照unicode编码读取。(bom是微软定义的一种文件头部协定,存储在文件头部,存储内容就是标识文件编码的信息。)而生成csv的平台不一定遵循微软的bom协议,导致如果输出非unicode编码的csv文件(如utf-8),并且没有生成bom信息的话,Excel自动按照unicode编码读取,就会出现乱码问题。

解决:只需将非unicode编码的CSV文件,用文本编辑器(Notepad++)打开并转换为带bom的编码形式(具体编码方式随意),问题解决。

每次都是手动打开CSV文件,修改并转换编码,然后再保存,那不是很傻么?既然CSV文件是程序生成的,那怎么用程序解决这个乱码问题,让生成的CSV文件用Excel打开时不会出现乱码?

用hutool工具自带了bom识别,转换reader的方法可以解决

java 复制代码
BomReader bomReader = IoUtil.getBomReader(inputStream);

参考

相关推荐
彧azz1 小时前
Java学习语法篇:变量
java·学习
信誓旦旦的程序猿2 小时前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)2 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt3 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei3 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩4 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
小溪学编程4 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
HZero.chen4 小时前
Java 匿名类简介
java·匿名类
用户3126874877204 小时前
Java 泛型擦除到底擦掉了什么?类型安全与桥接方法深度拆解
java
暖焰核心5 小时前
继承全解——继承、默认成员函数、切片、隐藏与虚继承
java·前端·javascript