bom csv java_JAVA导出CSV乱码问题

背景

我在项目中使用阿里云OSS存储文件,导出时导出为csv格式的文件。然而打开时总是存在中文乱码。

通过网上的一番搜索,大抵是使用记事本先打开csv文件,然后再保存为ANSI格式,然后再用excel打开时就不存在乱码了。但这不是程序里的解决方式,我们不可能提供一个半成品的导出文件供用户使用。经过一番网上搜寻,发现问题的根源在于UTF8的BOM信息头。

本来UTF8是不需要BOM头的,这就不得不说到微软的可恶了。

BOM简介

BOM中文译作”字节顺序标记”,UTF8本不需要BOM来表明字节顺序,但WINDOWS用BOM来标记文件文件的编码方式。BOM的UTF8编码是”EF BB BF”,所以如果接收者收到以”EF BB BF”开头的字节流,就知道这是UTF8编码了。WINDOWS系软件保存的UTF8编码的文件需要文件的开头保有这个BOM字符。

问题解决

项目中使用OSS存储文件,存储成功后返回一个签名过的文件url地址,前端再根据这个url去请求获取文件。由于前端是直接使用”window.open(url)”的方式,直接新开窗口访问链接,下载下来的文件默认是UTF8编码的,因此使用excel打开时需要BOM字符来表明是UTF8编码,否则其中的中文则会产生乱码。

因此,在OSS存储时,我们就需要额外添加BOM头一并存储。代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17OSSClient client = new OSSClient(ossHelper.getEndPoint(), ossHelper.getAccessKeyId(),

ossHelper.getAccessKeySecret());

ObjectMetadata objectMetadata = new ObjectMetadata();

objectMetadata.setContentType("application/vnd.ms-excel");

objectMetadata.setContentEncoding("UTF-8");

objectMetadata.setContentDisposition("attachment; filename=" + fileName + ".csv");

// 增加BOM头信息

String bom = new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF });

try {

// 以同样的编码获取字节流

client.putObject(ossHelper.getBucketName(), fileName,

new ByteArrayInputStream((bom + exportFileString).getBytes("UTF-8")), objectMetadata);

}catch (UnsupportedEncodingException e){

e.printStackTrace();

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值