「带BOM 的UTF-8」和「无BOM 的UTF-8」有什么区别?网页 ...
文章推薦指數: 80 %
UTF-8 不需要BOM,尽管Unicode 标准允许在UTF-8 中使用BOM。
所以不含BOM 的UTF-8 才是标准形式,在UTF-8 文件中放置BOM 主要是微软的习惯(顺便提一下:把带有BOM 的 ...
HTMLUnicode(统一码)字符编码UTF-8字节序标记(BOM)「带BOM的UTF-8」和「无BOM的UTF-8」有什么区别?网页代码一般使用哪个?关注者1,196被浏览586,947关注问题写回答邀请回答好问题44条评论分享27个回答默认排序梁海英语等6个话题下的优秀答主关注375人赞同了该回答UTF-8不需要BOM,尽管Unicode标准允许在UTF-8中使用BOM。
所以不含BOM的UTF-8才是标准形式,在UTF-8文件中放置BOM主要是微软的习惯(顺便提一下:把带有BOM的小端序UTF-16称作「Unicode」而又不详细说明,这也是微软的习惯)。
BOM(byteordermark)是为UTF-16和UTF-32准备的,用于标记字节序(byteorder)。
微软在UTF-8中使用BOM是因为这样可以把UTF-8和ASCII等编码明确区分开,但这样的文件在Windows之外的操作系统里会带来问题。
「UTF-8」和「带BOM的UTF-8」的区别就是有没有BOM。
即文件开头有没有U+FEFF。
UTF-8的网页代码不应使用BOM,否则常常会出错。
这是一个小例子:为什么这个网页代码
早知道上得山多终遇老虎,在@梁海老兄面前耍Unicode总会有这一天的⋯⋯首先,BOM是啥。
这个就不解释了,Wikipedia上很详细。
http://en.wikipedia.org/wiki/Byte_order_mark。
在网页上使用BOM是个错误。
BOM设计出来不是用来支持HTML和XML的。
要识别文本编码,HTML有charset属性,XML有encoding属性,没必要拉BOM撑场面。
虽然理论上BOM可以用来识别UTF-16编码的HTML页面,但实际工程上很少有人这么干。
毕竟UTF-16这种编码连ASCII都双字节,实在不适用于做网页。
其实说BOM是个坏习惯也不尽然。
BOM也是Unicode标准的一部分,有它特定的适用范围。
通常BOM是用来标示Unicode纯文本字节流的,用来提供一种方便的方法让文本处理程序识别读入的.txt文件是哪个Unicode编码(UTF-8,UTF-16BE,UTF-16LE)。
Windows相对对BOM处理比较好,是因为Windows把Unicode识别代码集成进了API里,主要是CreateFile()。
打开文本文件时它会自动识别并剔除BOM。
Windows用这个有历史原因,因为它最初脱胎于多代码页的环境。
而引入Unicode时Windows的设计者又希望能在用户不注意的情况下同时兼容Unicode和非Unicode(Multiplebyte)文本文件,就只能借助这种小trick了。
相比之下,Linux这样的系统在多locale的环境中浸染的时间比较短,再加上社区本身也有足够的动力轻装前进(吐槽:微软对兼容性的要求确实是到了非常偏执的地步,任何一点破坏兼容性的做法都不允许,以至于很多时候是自己绑住自己的双手),所以干脆一步到位进入UTF-8。
当然中间其实有一段过渡期,比如从最初全UTF-8的GTK+2.0发布到基本上所有GTK开发者都弃用多locale的GTK+1.2,我印象中至少经历了三到四年。
BOM不受欢迎主要是在UNIX环境下,因为很多UNIX程序不鸟BOM。
主要问题出在UNIX那个所有脚本语言通行的首行#!标示,这东西依赖于shell解析,而很多shell出于兼容的考虑不检测BOM,所以加进BOM时shell会把它解释为某个普通字符输入导致破坏#!标示,这就麻烦了。
其实很多现代脚本语言,比如Python,其解释器本身都是能处理BOM的,但是shell卡在这里,没办法,只能躺着也中枪。
说起来这也不能怪shell,因为BOM本身违反了一个UNIX设计的常见原则,就是文档中存在的数据必须可见。
BOM不能作为可见字符被文本编辑器编辑,就这一条很多UNIX开发者就不满意。
顺便说一句,即使脚本语言能处理BOM,随处使用BOM也不是推荐的办法。
各个脚本语言对Unicode的处理都有自己的一套,Python的#-*-coding:utf-8-*-,Perl的useutf8,都比BOM简单而且可靠。
另一个好消息是,即使是必须在Windows和UNIX之间切换的朋友也不会悲催。
幸亏在UNIX环境下我们还有VIM这种神器,即使遇到BOM挡道,我们也可以通过setnobomb;setfileencoding=utf8;w三条命令解决问题。
最后回头想想,似乎也真就只有Windows坚持用BOM了。
P.S.:本问题是自己的第150个回答。
突然发现自己回答得很少很少⋯⋯P.S.2:突然想起需要解释一下为什么说VIM去除bomb的操作需要在UNIX下完成。
因为VIM在Windows环境下有一个奇怪的bug,总是把UTF-16文件识别成二进制文件,而UNIX(Linux或者Mac都可以)下VIM则无问题。
这个问题从VIM6.8一直跟着我到VIM7.3。
目前尚不清楚这是VIM的bug还是我自己那个.vimrc文件的bug。
如有高手解答不胜感激。
编辑于2012-04-1023:42赞同36429条评论分享收藏喜欢收起
延伸文章資訊
- 1這些是什麼? BOM/UFT-8有簽章/withBOM/withoutBOM - iT 邦幫忙
這是另一篇關於BOM之亂的描述. Windows 作業系統不少程式(像是記事本),預設會對UTF-8 檔案加上BOM 而Linux 則避免妨礙到像是解譯器腳本而不加BOM,對於沒有預期要 ...
- 2[PHP] 無痛遠離UTF-8 BOM - 工程的日子每天都很師
(圖片來源) 某次我利用php Curl 來呼叫WordPress API ,透過php strlen function 查看回傳的123 字串長度,印出在網頁上時卻顯示有8個字元,打.
- 3「带BOM 的UTF-8」和「无BOM 的UTF-8」有什么区别?网页 ...
UTF-8 不需要BOM,尽管Unicode 标准允许在UTF-8 中使用BOM。 所以不含BOM 的UTF-8 才是标准形式,在UTF-8 文件中放置BOM 主要是微软的习惯(顺便提一下:把带...
- 4UTF8文件帶BOM引起的問題 - 台部落
UTF-8 不需要BOM,儘管Unicode 標準允許在UTF-8 中使用BOM。 所以不含BOM 的UTF-8 纔是標準形式,在UTF-8 文件中放置BOM 主要是微軟的習慣(順便提 ...
- 5UTF-8与UTF-8 BOM - bijian1013 - 博客园
在我们通常使用的windows系统中,我发现了一个有趣的现象。我新建一个空的文本文档,点击文件-另存为-编码选择UTF-8,然后保存。