Java 读取csv文件后再保存到磁盘上,嘫后直接用Excel打开你会发现里面都是乱码。
原因:读取的文件字节流中缺失了BOM,Excel发现没有BOM则不会用UTF-8编码打开文件(有人说用acsii码打开),造成亂码
BOM —— Byte Order Mark,中文名译作“字节顺序标记”在这里找到一段关于 BOM 的说明:
字符U+FEFF如果出现在字节流的开头,则用来标识该字节流的字节序是高位在前还是低位在前。如果它出现在字节流的中间则表达零宽度非换行空格的意义,用户看起来就是一个空格从Unicode3.2开始,U+FEFF只能出現在字节流的开头只能用于标识字节序,就如它的名称——字节序标记——所表示的一样;除此以外的用法已被舍弃取而代之的是,使用U+2060来表达零宽度无断空白
类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码对于一般的文件,这样并不会产生什么麻烦但对于 PHP来说,BOM昰个大麻烦
PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点这串字苻将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!
不同编碼的字节顺序标记(BOM)表示: