UTF-8与UTF-8 BOM

  在我们通常使用的windows系统中,我发现了一个有趣的现象。我新建一个空的文本文档,点击文件-另存为-编码选择UTF-8,然后保存。此时这个文件明明是空的,却占了3字节大小。原因在于:此时保存的编码方式自动会变为UTF-8 BOM。

一.一个汉字在不同的编码方式中占多少字节?

  1.在UTF-8中,一个汉字占3个字节(一个字符占一个字节)

  2.在ASCII码中,一个汉字占2个字节(一个字符占一个字节)

  3.在Unicode编码中,一个汉字占2个字节(一个字符同样占两个字节,所以JAVA中char a = '中';是可以的)

二.什么是BOM
  BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。对于UTF-8来说,BOM并不是必须的,因为BOM用来标记多字节编码文件的编码类型和字节顺序(big-endian或little-endian)。

  在绝大多数编辑器中都看不到BOM字符,因为它们能理解Unicode,去掉了读取器看不到的题头信息。若要查看某个Unicode文件是否以BOM开头,可以使用十六进制编辑器。下表列出了不同编码所对应的BOM。

BOM Encoding
EF BB BF UTF-8
FE FF UTF-16 (big-endian)
FF FE UTF-16 (little-endian)
00 00 FE FF UTF-32 (big-endian)
FF FE 00 00 UTF-32 (little-endian)

三.BOM的来历
  为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE(U+FEFF)字符开头。这作为一个“特征符”或“字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序。

  Linux/UNIX 并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

四.带BOM和不带BOM的区别
  「UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF,也就是说有没有这个标记。

五.带还是不带?

  不含BOM的UTF-8才是标准形式,UTF-8不需要BOM

  带BOM的UTF-8文件的开头会有U+FEFF,所以我新建的空文件会有3字节的大小。

  如果你的编程平台需要跨平台编译,比如,会在linux平台上编译,而不是只在windows上运行,建议不带BOM,unicode标准就是不带,带BOM毕竟那是微软的那一套,带了会出现很大的问题。反之,如果你的程序只在windows平台上编译出windows程序,这个可有可无。
  注意:这里所说的带还是不带,指的是:源码字符集(the source character set)-源码文件是使用何种编码保存的;

  不过,现在linux平台下的GCC 4.6及以上的版本已经可以支持带BOM的源码了!!!!!

  所以之前出现的问题也可以不用冲突,带或者不带,以后就不会成为一个问题。

六.创建UTF-8(而非UTF-8 BOM)文件的方法

  在发现文件另存为UTF-8缺得到UTF-8 BOM文件后,我们怎样才能得到UTF-8呢?

  方法1.先另存为UTF-8保存,再使用notepad++打开,把里面的编码设置为无BOM的UTF-8然后保存。(此方法治标不治本,因为当你再次在里面写汉字时,文件会自动变成UTF-8 BOM)

  方法2.用JAVA代码

  

参考文章:

https://blog.csdn.net/legendaryhsl/article/details/78794121

https://blog.csdn.net/u014805066/article/details/78874460

posted on 2018-10-21 15:50  bijian1013  阅读(2460)  评论(2编辑  收藏  举报

导航