当前位置: 首页 > news >正文

CSV文件中的中文乱码--UTF-8 with BOM

文章目录

  • 1. 现象
  • 2. 原因
  • 3. BOM
    • 3.1 什么是BOM?
    • 3.2 BOM的作用
    • 3.3 特殊性
  • 4. 如何解决乱码?
    • 4.1 手动设置格式
    • 4.2 自动设置格式
      • 4.2.1 Python如何设置:
      • 4.2.2 java如何设置

1. 现象

在使用了UTF-8格式编码之后,CSV文件在Excel中打开还是乱码。

2. 原因

win系统在打开CSV文件时,会判断并选择CSV文件的编码格式。
win默认是需要使用带BOM的UTF-8编码,才能打开不乱码。读不到BOM的格式码,会认为是ANSI格式,进而造成csv中的中文乱码。

3. BOM

3.1 什么是BOM?

BOM(Byte Order Mark,字节顺序标记) 是位于文件开头的特殊标记,用于标识文本文件的编码方式和字节顺序(仅对多字节编码如UTF-16/UTF-32有意义)。

3.2 BOM的作用

  • 标识编码格式​:帮助程序快速识别文件是UTF-8、UTF-16还是UTF-32编码。
  • 解决乱码问题​:避免程序误判编码(如将UTF-8误认为ANSI/GBK)。
  • 字节顺序标记​:仅对UTF-16/UTF-32有效(大端序或小端序),UTF-8的字节顺序固定,无需标记顺序

3.3 特殊性

  • 非必需但广泛兼容​:
    UTF-8本身不需要BOM(因字节顺序固定),但Windows系统(如记事本)依赖BOM识别UTF-8文件,无BOM可能被误判为ANSI。
  • 现代趋势​:
    Web开发、代码文件(如JSON、Python)通常禁用BOM,因部分解析器会报错。

4. 如何解决乱码?

4.1 手动设置格式

win系统下将csv文件选择记事本打开,然后另存为,选择格式为“带BOM的UTF-8”,保存完再打开,中文就可以正常显示了。

4.2 自动设置格式

4.2.1 Python如何设置:

写文件

content = "你好"
with open("file.txt", "w", encoding="utf-8-sig") as f:  # 'sig'表示BOM
    f.write(content)

读文件:

with open("file.txt", "r", encoding="utf-8-sig") as f:  # 自动跳过BOM
    content = f.read()

4.2.2 java如何设置

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import java.io.*;

public class CsvWithBomCommons {
    public static void main(String[] args) throws IOException {
        File file = new File("output_with_bom.csv");

        // 1. 创建文件输出流并写入BOM
        try (OutputStream os = new FileOutputStream(file);
             OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8")) {
            
            // 2. 写入BOM头
            os.write(0xEF);
            os.write(0xBB);
            os.write(0xBF);
            
            // 3. 使用CSVPrinter写入数据 CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT);
            printer.printRecord("姓名", "年龄");
            printer.printRecord("张三", 25);
            printer.printRecord("李四", 30);
        }
    }
}

相关文章:

  • DeepSeek 与开源:肥沃土壤孕育 AI 硕果
  • react/vue中前端多图片展示页面优化图片加载速度的五种方案
  • 高德地图 JS-SDK 实现教程
  • LFM调制信号分类与检测识别
  • electron-builder参数详解
  • 医用多功能压力检测仪,精密医疗的守护者
  • 04 GE - 钳制属性,等级
  • 面向MoE和推理模型时代:阿里云大数据AI产品升级发布
  • k8s中缩放pod规格
  • 微信小程序-下拉滚动加载数据
  • (2025亲测可用)Chatbox多端一键配置Claude/GPT/DeepSeek-网页端配置
  • XDocument和XmlDocument的区别及用法
  • Java 正则表达式综合实战:URL 匹配与源码解析
  • 详细解读TypeScript中 declare 关键字
  • 2k1000LA , 调试串口改成通信串口, uart.
  • 从三次方程到复平面:复数概念的奇妙演进(四)
  • 跨境贸易之常见的贸易术语
  • 思科模拟器的单臂路由,交换机,路由器,路由器只要两个端口的话,连接三台电脑该怎么办,划分VLAN,dotlq协议
  • ASP.NET Core 性能优化:客户端响应缓存
  • Java从入门到“放弃”(精通)之旅——方法的使用⑤
  • 茅台1935今年动销达到预期,暂无赴港上市计划!茅台业绩会回应多个热点
  • 教育部:启动实施县中头雁教师岗位计划,支撑县中全面振兴
  • 哈尔滨工业大学原副校长王魁业逝世,享年92岁
  • 上海楼市“银四”兑现:新房市场高端改善领跑,二手房量价企稳回升
  • 青岛双星名人集团管理权之争:公司迁址,管理层更迭
  • 进化版大巴黎通杀英超,那个男人后悔了吗