编码-Windows中UTF8与BOM

之前有个同事写业务逻辑时出现了乱码。

乱码,本来不是问题,问题是如何去“以恰当的方式”去将乱码翻译成可读的内容。

我们部门的软件Linux/Unix上运行的,业务侧的同事很多时候不习惯使用这样的环境,他们通常在Windows下编辑业务文件,再使用一些工具将文件传输到Linux下。

假设在Windows下保存为UTF8,然后传到Linux下会是什么效果呢?

1.

2.

3.

4.

上传test.txt到Linux下,然后使用file查看:

[jiang@eb50 ~]$ ll test.txt
-rw-r--r-- 1 jiang jiang 17 06-12 20:22 test.txt
[jiang@eb50 ~]$ file test.txt
test.txt: UTF-8 Unicode text, with no line terminators

5.

使用vi打开,看到前面有:

6.

我们直接看十六进制:

:%!xxd

注意开头的三个字节:

EF BB BF。

这就是BOM标记(字节顺序标记—Byte Order Mark)。

注:实际上EF BB BF只是一种BOM标记。

所以要记得,在Windows下编辑的文件如果是Unicode,拉到Linux下,可能并不是纯粹的!

那什么是纯粹的?

我现在的环境是:

[jiang@eb50 ~]$ echo $LANG
en_US.UTF-8

终端也是UTF8编码==》

[jiang@eb50 ~]$ echo "我是test1280" >> test_pure.txt
[jiang@eb50 ~]$ file test_pure.txt
test_pure.txt: UTF-8 Unicode text

然后看看test_pure.txt的码流:

这下子更清楚了吧?在Linux直接编辑是没有BOM标记的。

BOM有啥用?

BOM是放在文件最开头的一段标记,通过这段标记可以知道文件是按大端还是小端编码的,主要是在类似UTF16编码中会使用,因为涉及到了字节序的问题。(具体过两天再写Blog专门讨论下)

UTF8的编码单元是单字节,本来不需要BOM作标记,因为UTF8在传输中没有大小端的问题。

可是,可是,你想过吗?

Windows中的文本都是txt作为后缀名,假设有一个文件是UTF8编码,有一个是GBK编码,那么Windows如何帮我们正确地显示出来呢?Windows是怎么知道文件是什么编码的呢?

这里就是使用了BOM来表明这个文件是UTF8编码的。

当我们从文件描述符中读取数据时,如果收到的前三个字节是EF BB BF,那么我们也就知道这一段文字是UTF8啦~

总结:

1.UTF8编码,在Windows下使用记事本编辑保存,实际上是携带BOM前缀的;

2.EF BB BF只是一种BOM,还有别的BOM标记;

3.Windows是通过对BOM的识别来确认是否是UTF8文件的;

疑问:

1.我发现个问题:如果把刚刚的test_pure.txt传回Windows下,使用记事本打开还是可以正确显示文本的,也就是说Windows可能不仅仅通过前三个字节是否是EF BB BF来决定文件编码,有可能是其他方式。

编码-Windows中UTF8与BOM相关推荐

  1. python转utf-8编码_python3中utf-8编码如何转换?

    python中的编码之间可以相互转换,这个我们在之前的文章中有讲到.那小编开始提问了,utf-8编码如何转换?有的小伙伴可能对这个词模模糊糊的有点印象.但是如果我们提到unicode编码大家就会觉得很 ...

  2. UTF-8与UTF-8 without BOM

    UTF-8编码的文件可以分为without BOM和BOM两种格式. 何谓BOM? "EF BB BF" 这三个字节就叫BOM,BOM的全称叫做"Byte Order M ...

  3. VS2015支持UTF-8 with BOM编码格式处理中文、西班牙文、法文等非英文字符

    Detail: 在使用VS2015编译ImageMagicK库时,由于其中源码文件带有非英文字符串,导致VS编译出错. LANGUAGE(bn /* Bengali */,GLASS,"আম ...

  4. Notepad++中的UTF-8无BOM格式编码

    Notepad++中,关于utf-8的编码格式,有两种:以UTF-8无BOM格式编码和以UTF-8格式编码. 很容易给人一种错觉,第一反应会选择以UTF-8格式编码,感觉这种就是平时所说的UTF-8, ...

  5. 【转】刨根究底字符编码之十一——UTF-8编码方式与字节序标记BOM

    一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理 ...

  6. 判断utf8无bom_[Java] 判断UTF8 无BOM编码

    UTF-8是一种变长的编码方式,节省存储空间,适用于互联网传输. Windows系统使用带BOM(Byte Order Mark)UTF-8编码的可以通过文件前三个字节来判断: EF BB BF UT ...

  7. php utf8(无bom),php中utf8 与utf-8 与utf8 无BOM

    utf8 与utf-8 相信很多程序员刚开始也会有这样的疑惑,如题,我也是. 其实,他们可以这样来区分. 一.在php和html中设置编码,请尽量统一写成"UTF-8",这才是标准 ...

  8. java转文件编码bom_编码转换:UTF-8 BOM to GBK

    在网上看了很多例子,也查了python API,发现都不完整,原因就在于都没考虑到有BOM和无BOM两种情况.也有说用codecs.EncodedFile(...)来做的,试了很多次,无论是有BOM还 ...

  9. cmd mysql utf8_MySQL中UTF8编码的数据在cmd下乱码

    花了一下午,解决MySQL在Windows的cmd下中文乱码的问题. mysql> use abc; Database changed mysql> select * from schoo ...

最新文章

  1. 系统由单体架构到微服务架构到底是如何演进的?
  2. SDH点对点接入与MPLS有什么区别?——Vecloud
  3. mysql 5.6 root密码_MySQL 5.6 root 初始密码
  4. 1.5 特征缩放-机器学习笔记-斯坦福吴恩达教授
  5. swift 富文本编辑_如何使用Swift构建协作式文本编辑器
  6. python xlrd模块
  7. 聊聊 HTTP 协议的知识点
  8. C++ 作用域与生命周期
  9. include vector 编译出错VC++
  10. InDesign教程,如何更改字体和字体大小?
  11. arm汇编—str,mov等指令
  12. 欧拉角Yaw、Pitch、Roll
  13. 乐优商城(01)--项目启动
  14. python3实现json转excel
  15. 5G无线技术基础自学系列 | 时域资源
  16. PAT Basic Level 1069 微博转发抽奖 解题思路及AC代码 v1.0
  17. 神奇的主力成本线!居然能将主力成本运筹帷幄?!
  18. Spectral matting
  19. 什么是运维?运维开发需要做哪些事情?
  20. 国内外视频编解码标准体系-说说MPEG、ITU、AOM、AVS演进历程

热门文章

  1. 8255典例之打印机(选通信号和置位复位控制字的应用)
  2. ImageJ-一套强大的图片处理工具
  3. Linux软件包使用
  4. 国际品牌商为何钟爱天猫国际而冷落京东全球购?
  5. 分辨率,屏幕尺寸,屏幕密度,dp,px,sp
  6. ESP32超详细学习记录:wifi配网,AP配网,浏览器配网,无线配网
  7. 《见与不见》原题《班扎古鲁白玛的沉默》   作者:扎西拉姆·多多
  8. Carla中所有的ActorBlueprint及其对应的ActorAttribute(二)
  9. 关于架构的学习之三驾马车
  10. telerik学习记录-RadButton(上)