UTF-8与UTF-8 BOM - bijian1013 - 博客园
文章推薦指數: 80 %
在我们通常使用的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
延伸文章資訊
- 1位元組順序記號 - 维基百科
位元組順序記號(英語:byte-order mark,BOM)是位於碼點 U+FEFF 的統一碼字符的名称。當以UTF-16或UTF-32來將UCS/統一碼字符所組成的字串編碼時,這個字符被用來...
- 2「帶BOM 的UTF-8」和「無BOM 的UTF-8」有什麼區別
UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB...
- 3UTF8文件帶BOM引起的問題 - 台部落
UTF-8 不需要BOM,儘管Unicode 標準允許在UTF-8 中使用BOM。 所以不含BOM 的UTF-8 纔是標準形式,在UTF-8 文件中放置BOM 主要是微軟的習慣(順便提 ...
- 4[PHP] 無痛遠離UTF-8 BOM - 工程的日子每天都很師
(圖片來源) 某次我利用php Curl 來呼叫WordPress API ,透過php strlen function 查看回傳的123 字串長度,印出在網頁上時卻顯示有8個字元,打.
- 5UTF-8与UTF-8 BOM - bijian1013 - 博客园
在我们通常使用的windows系统中,我发现了一个有趣的现象。我新建一个空的文本文档,点击文件-另存为-编码选择UTF-8,然后保存。