用java代码解决excel打开csv文件乱码问题
发布日期:2021-05-10 04:21:18 浏览次数:21 分类:精选文章

本文共 1608 字,大约阅读时间需要 5 分钟。

为了解决由于缺少字节顺序标记(BOM)导致的乱码问题,我们可以通过在文件开头添加UTF-8编码的BOM来修复代码。


问题分析

当从外部文件读取数据并保存到新文件时,若原文件没有包含BOM,使用Excel打开时可能会出现乱码。此原因是因为BOM用于标明文件的编码和字节顺序。当缺失BOM时,Excel无法正确识别编码方式,从而导致错误显示为乱码。


解决方案(修改后的代码)

public static void main(String[] args) {
byte[] commonCsvHead = new byte[3];
commonCsvHead[0] = (byte) 0xEF;
commonCsvHead[1] = (byte) 0xBB;
commonCsvHead[2] = (byte) 0xBF;
try {
File file = new File("c://csv//aa.csv");
FileInputStream inputStream = new FileInputStream(file);
byte[] inputBytes = IOUtils.toByteArray(inputStream);
// 添加BOM字节
byte[] outputBytes = new byte[inputBytes.length + 3];
System.arraycopy(inputBytes, 0, outputBytes, 0, inputBytes.length);
// 将BOM添加到输出的开始部分
outputBytes[0] = (byte) 0xEF;
outputBytes[1] = (byte) 0xBB;
outputBytes[2] = (byte) 0xBF;
File outputFile = new File("c://csv//newfile.csv");
FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(outputBytes);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

BOM的作用解释

字节顺序标记(BOM,Byte Order Mark)用于告知文件使用的编码方式和字节顺序(大端或小端)。在UTF-8编码中,BOM的值为0xEF 0xBB 0xBF。在文件开头添加此BOM,让Excel和其他读取程序识别编码,从而避免乱码问题。


BOM的作用机制

  • UTF-8编码:BOM为EF BB BF。在文件开头添加这些字节,使Excel识别为UTF-8编码。
  • 其他编码:不同编码有各自的BOM。例如,UTF-16大端为FE FF,小端为FF FE。

注意事项

  • 确保编码正确:确认原始文件的编码设置。如果文件没有BOM,按照正确的UTF-8编码保存到新文件,并在开始添加BOM。

  • 避免BOM重复:通常,只有实际文件开头需要添加BOM。操作时避免双重BOM重复添加。

  • 检查文件类型:涉及的编码类型不同,BOM也需要相应选择。例如,文本文件使用UTF-8,嵌入式系统可能使用不同的编码。

  • 通过上述方法,您可以确保文件正确解码,避免乱码出现问题。

    上一篇:汇编 第一章 基础知识
    下一篇:java如何实现以数据流的形式下载压缩包到本地?

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年04月22日 18时41分52秒