UTF-8与UTF-8 BOM - bijian1013 - 博客园

文章推薦指數: 80 %
投票人數:10人

在我们通常使用的windows系统中,我发现了一个有趣的现象。

我新建一个空的文本文档,点击文件-另存为-编码选择UTF-8,然后保存。

首页 新闻 博问 专区 闪存 班级 我的博客 我的园子 账号设置 简洁模式... 退出登录 注册 登录 bijian1013 UTF-8与UTF-8BOM   在我们通常使用的windows系统中,我发现了一个有趣的现象。

我新建一个空的文本文档,点击文件-另存为-编码选择UTF-8,然后保存。

此时这个文件明明是空的,却占了3字节大小。

原因在于:此时保存的编码方式自动会变为UTF-8BOM。

一.一个汉字在不同的编码方式中占多少字节?   1.在UTF-8中,一个汉字占3个字节(一个字符占一个字节)   2.在ASCII码中,一个汉字占2个字节(一个字符占一个字节)   3.在Unicode编码中,一个汉字占2个字节(一个字符同样占两个字节,所以JAVA中chara='中';是可以的) 二.什么是BOM  BOM(byte-ordermark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。

对于UTF-8来说,BOM并不是必须的,因为BOM用来标记多字节编码文件的编码类型和字节顺序(big-endian或little-endian)。

  在绝大多数编辑器中都看不到BOM字符,因为它们能理解Unicode,去掉了读取器看不到的题头信息。

若要查看某个Unicode文件是否以BOM开头,可以使用十六进制编辑器。

下表列出了不同编码所对应的BOM。

BOMEncoding EFBBBFUTF-8 FEFFUTF-16(big-endian) FFFEUTF-16(little-endian) 0000FEFFUTF-32(big-endian) FFFE0000UTF-32(little-endian) 三.BOM的来历  为了识别Unicode文件,Microsoft建议所有的Unicode文件应该以ZEROWIDTHNOBREAKSPACE(U+FEFF)字符开头。

这作为一个“特征符”或“字节顺序标记(byte-ordermark,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程序,这个可有可无。

  注意:这里所说的带还是不带,指的是:源码字符集(thesourcecharacterset)-源码文件是使用何种编码保存的;   不过,现在linux平台下的GCC4.6及以上的版本已经可以支持带BOM的源码了!!!!!   所以之前出现的问题也可以不用冲突,带或者不带,以后就不会成为一个问题。

六.创建UTF-8(而非UTF-8BOM)文件的方法   在发现文件另存为UTF-8缺得到UTF-8BOM文件后,我们怎样才能得到UTF-8呢?   方法1.先另存为UTF-8保存,再使用notepad++打开,把里面的编码设置为无BOM的UTF-8然后保存。

(此方法治标不治本,因为当你再次在里面写汉字时,文件会自动变成UTF-8BOM)   方法2.用JAVA代码    参考文章: https://blog.csdn.net/legendaryhsl/article/details/78794121 https://blog.csdn.net/u014805066/article/details/78874460 postedon 2018-10-2115:50  bijian1013  阅读(3154)  评论(2)  编辑  收藏  举报 刷新评论刷新页面返回顶部 导航 Poweredby: 博客园 Copyright©2022bijian1013 Poweredby.NET6onKubernetes



請為這篇文章評分?