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);

参考

相关推荐
金銀銅鐵2 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工3 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop3 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x3 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
驭渊的小故事4 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客4 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1884 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn5 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su5 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
我命由我123456 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法