导出CSV文件时中文乱码问题的解决

目的

记录解决一个导出CSV文件时中文乱码问题的过程和方法,备忘, 也希望能帮助遇到同样问题的人。

 

问题

Android APP导出的CSV文件中,中文显示为乱码。

最近项目中的Anroid App需要将数据以CSV文件的形式导出。基于原来的经验,更得益于Google的力量,很快便完成了基本功能的编码。但就在最后测试的步骤中,问题出现了。导出CSV文件的列名中,中文全部显示为乱码。

首先想到的是,可能写入文件是编码是ASCII?显式地修改为UTF-8,问题依旧。

用Notepad,Editplus以文本形式打开CSV文件,中文显示正常。

 

解决方法

再次感谢万能的Google与Baidu,经过多次的思考及搜索后。找到了问题的答案:

在文件的开头,在写入任何内容之前,向流中写入 0xEF,0xBB,0xBF三个字节(此处用16进制表示)。用以告诉Excel,此CSV文件的编码为UTF-8.

//mark the file as UTF-8 encoded
out.write(new byte[]{(byte) 0xEF, (byte) 0xBB,(byte) 0xBF});

 

原理(并非十分确定)

Excel打开CSV文件(实际为文本文件)时,需要知道文件的编码方式(encoding)。如果未能获取,则默认用ASCII打开。

此处的三个字节 0xEF,0xBB,0xBF为UTF-8的BOM,标明了文件是UTF-8编码方式的,所以问题得以解决。

BOM为Byte Order Mark,是为了解决UTF-16等多字节编码的字节序问题(big endian,little big endian),UTF-8并不需要。

但此处的0xEF,0xBB,0xBF是用做了UTF-8的标志,而非BOM的原用途。

 

 

 

posted @ 2014-01-14 17:26  三只小猪  阅读(9508)  评论(0编辑  收藏  举报