问题描述:
直接使用OpenCSV的CSVWriter往流或文件中写入数据并指定编码格式为UTF-8时,使用Excel直接打开会出现读取中文出现乱码的问题。
原因分析:
UTF-8以字节为编码单元因此不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 “Zero Width No-Break Space” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。
在使用CSV库往文件中写数据前,先添加一个BOM头即可在Excel打开该文件时采用UTF-8的编码格式读取内容,防止出现乱码现象。
解决方案:
//写
public void write(String[] data, HttpServletResponse response, ...){
//加入BOM头防止Excel读取utf-8编码文件乱码
byte [] bs = { (byte)0xEF, (byte)0xBB, (byte)0xBF};
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(response.getOutputStream());
outputStreamWriter.write(new String(bs));
CSVWriter writer = new CSVWriter(outputStreamWriter);
//写入数据体
writer.writeNext(data);
writer.close();
response.getOutputStream().close();
}
//读
public void read(InputStream inputStream) {
//读取utf-8编码的csv文件,需要使用BOMInputStream去掉BOM头
CSVReader reader = new CSVReader(new InputStreamReader(new BOMInputStream(inputStream),"utf-8"));
.....
}