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代码
参考文章:
posted on 2018-10-21 15:50 bijian1013 阅读(6771) 评论(2) 编辑 收藏 举报