Unicode

统一码,也叫万国码、单一码(Unicode)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。 就是将世界上所有的文字用2个字节统一进行编码。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。
Unicode的学名是"Universal Multiple-Octet Coded Character Set",通用多八位编码字符集,简称为UCS。
现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。

BOM

在UCS 编码中有一个叫做 “Zero Width No-Break Space” ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。而 FEFF 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 “Zero Width No-Break Space”。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到FFFE,就表明这个字节流是 Little- Endian 的。因此字符 “Zero Width No-Break Space” (“零宽无间断间隔”)又被称作 BOM。

UTF-8

UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

UTF-8 BOM

UTF-8 不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 “Zero Width No-Break Space” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记文本文件的编码方式的。

CSV文件乱码问题

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入UTF-8 BOM头。记事本等编辑器通过它来识别这个文件是否以UTF-8编码(当然即便没有UTF-8 BOM头记事本也能通过其它方式正确识别UTF-8编码)。
如果一个UTF-8编码的字符串的开头处没有BOM头又会发生什么?
举个例子

代码demo

     /*** csv 写入文件头** @param pathAndName 文件全路径名*                    /Users/yangcheng/Documents/dkangel.csv* @throws IOException IO异常,上层捕获处理*/private static void addHeadToTmpCsv(String pathAndName) throws IOException {FileOutputStream outputStream = new FileOutputStream(pathAndName, true);try (OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);BufferedWriter writer = new BufferedWriter(streamWriter)) {writer.write("姓名,年龄,性别");writer.newLine();writer.write("dkangel,25,男");writer.newLine();writer.write("张三,30,男");writer.flush();} finally {outputStream.close();}}public static void main(String[] args) {String path = "/Users/yangcheng/Documents/dkangel.csv";try {addHeadToTmpCsv(path);} catch (IOException e) {e.printStackTrace();}}

运行结果


可以通过Java代码生成csv文件,未指定bom标识,使用excel查看的时候中文乱码了

文件头添加bom标识

 private static void addHeadToTmpCsv(String pathAndName) throws IOException {FileOutputStream outputStream = new FileOutputStream(pathAndName, true);// 追加BOM标识outputStream.write(0xef);outputStream.write(0xbb);outputStream.write(0xbf);// 或者 writer.write('\uFEFF');......}

运行结果

总结

Excel打开没有BOM头的csv文件时会出现乱码问题,添加bom标识后乱码问题解决

注意

bom标识只用添加一次,那就是文件头的位置。如果在数据行头部添加bom标识则单元格数据前会多一个空格出来,可以通过WPS提示看出。

附录

参考

• unicode:https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E7%A0%81/2985798?fromtitle=Unicode&fromid=750500
• bom:https://baike.baidu.com/item/BOM/2790364
• utf-8:https://baike.baidu.com/item/UTF-8/481798

CSV乱码 - UTF-8 Unicode (with BOM)相关推荐

  1. QT乱码总结3.UNICODE有无BOM

    QT乱码总结0.Qt乱码产生因素 https://blog.csdn.net/liujiayu2/article/details/103167953 QT乱码总结1.Unicode 和 UTF-8 h ...

  2. QT乱码总结1.Unicode 和 UTF-8

    QT乱码总结0.Qt乱码产生因素 https://blog.csdn.net/liujiayu2/article/details/103167953 QT乱码总结1.Unicode 和 UTF-8 h ...

  3. php 签名 bom,PHP与Unicode签名(BOM,Byte Order Mark)

    在编写或者修改用UTF-8编码保存的PHP文件时,有时会莫名其妙出现一些问题: 1. 页面显示一个"锘"字,其他一片空白: 2. 不能登入或者不能登出: 3. 页顶出现一条空白: ...

  4. UTF、Unicode、ASCII及中文编码

    一.Unicode缘起 Unicode是一种字符编码规范 . 1.国际标准ASCII编码 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits)  ...

  5. php 签名 bom,PHP教程:Unicode 签名(BOM)问题_php

    被 WordPress 模板的怪异代码空行折腾半天. 因为 Dansion 师兄的驱使,开始 Dreamweaver 征途.不过很少有人关注到,在 Dreamweaver 中使用 utf-8 编码保存 ...

  6. php csv乱码问题,如何解决php csv乱码问题

    php csv乱码的解决办法:首先重写fputcsv方法:然后添加转码功能,代码如"function fputcsv2($handle, array $fields, $delimiter ...

  7. golang处理excel打开csv乱码问题

    最近在一个项目中导入导出csv文件的时候用excel打开都会出现乱码的情况,但是用number打开却是正常的,由此可知是编码问题导致. 在导入读取csv文件时,因为golang默认支持utf8编码,所 ...

  8. python生成csv乱码

    python 生成 csv乱码: 从本地生成的csv通过flask传输下载全乱码了,但是在本地读取正常. 解决问题尝试查到比较多的方案: encoding='utf-8' encoding='utf- ...

  9. [python3 - TroubleShooting] requests爬取中文网站后直接print,以及保存csv乱码

    问题: page = requests.get().text返回的中文不管是直接print,还是保存进csv都出现了乱码 背景: 我爬取的网站head里定义了charset=utf-8 本地windo ...

最新文章

  1. 阿里云云盾吴翰清:未来将重点构建阿里云用户安全的大生态
  2. 解决wubi安装ubuntu时要下载系统映像文件问题
  3. calcite mysql_Apache顶级项目 Calcite使用介绍
  4. python文本的平均列数_文本的平均列数(Python程序实现)
  5. php网站漏洞检测对sql注入漏洞防护
  6. php怎么输出以前的时间,php输出指定时间以前时间格式的方法_PHP
  7. 将MATLAB中的图像信息用到Vivado中
  8. java发送outlook邮件_通过Java代码发送OutLook邮件
  9. Flink 1.12 资源管理新特性回顾
  10. mysql怎么多重查询_mysql基于值的多重查询
  11. 关于oracle with as用法
  12. Apple任意代码执行漏洞
  13. 一个项目中能提出哪些数据库优化_阿里资深技术专家曲山:优秀的数据库存储引擎应具备哪些能力?...
  14. 谈谈c++纯虚函数的意义!
  15. 软件工程:状态,行为,事件
  16. mysql授权replication_MySQL创建用户并授权REPLICATION CLIENT和REPLICATION SLAVE
  17. ubuntu20.04 开机速度非常慢
  18. H5页面调用微信授权获取code
  19. oracle 压缩备份比率,Oracle 10g备份集压缩(Backupset Compression)
  20. winscp 同步_使用WinSCP进行简单代码文件同步

热门文章

  1. 镇魂街武神躯怎么修改服务器,镇魂街武神躯怎么重置守护灵
  2. 品牌台式计算机主机,游戏台式电脑主机什么牌子好-游戏台式电脑主机品牌排行榜...
  3. “数据”首次被中央纳入生产要素,数字政务建设迫在眉睫丨钛度热评
  4. js mouseover/mouseout不停地循环
  5. 【2019西安ICPC邀请赛热身赛A hdu2036】求多(四)边形面积(四边形面积公式/向量叉积)
  6. 人体改造 VS 数字化身
  7. HTML 动画、3D学习之制作魔方练习
  8. [Unity3D]Shader学习笔记之点和矢量
  9. ping命令流程详解
  10. 你都42岁了还要做程序员?(入门必读)