字节顺序标记——BOM,Byte Order Mark

定义

BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。

介绍

UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。但不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯)。

「UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。

UTF-8 的网页代码不应使用 BOM,否则常常会出错。

这是一个小例子: [为什么这个网页代码内的信息会被浏览器理解为在内?]

为什么BOM不受欢迎

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的use utf8,都比BOM简单而且可靠。另一个好消息是,即使是必须在Windows和UNIX之间切换的朋友也不会悲催。幸亏在UNIX环境下我们还有VIM这种神器,即使遇到BOM挡道,我们也可以通过 set nobomb; set fileencoding=utf8; w 三条命令解决问题。

最后回头想想,似乎也真就只有Windows坚持用BOM了。

所以

Windows 该死的记事本有个臭名昭著的破毛病就是在 UTF-8 文件开头加 BOM,所以不要用记事本来编辑文件。
---------------------
作者:绯浅yousa
来源:CSDN
原文:https://blog.csdn.net/qq_15437667/article/details/52706217
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/bravesunforever/p/10346441.html

时间: 2024-11-06 09:42:56

字节顺序标记——BOM,Byte Order Mark的相关文章

UTF-8文件的Unicode签名BOM(Byte Order Mark)问题记录(EF BB BF)

背景 楼主测试的批量发送信息功能上线之后,查看后台运行日志,发现存在少量的ERROR日志,提示手机号码格式不正确. 之前没有出现过这样的问题,找运营要了上传的txt发送列表,发现格式是要求的UTF-8,且号码是符合规则的,反复查看未发现异常. 因为博主还有别的需求,所以直接反馈给了开发,让开发定位. 定位过程 两天之后,开发给了我两个文件,问我有没有办法找出这两个文件的不同.我看了一下,文件内容完全相同. 后来使用软件beyond compare进行十六进制对比终于发现了区别, 其中一个第一行多

什么是BOM(Byte Order Mark)?

BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码,但它对于文件的读者来说是不可见字符. 下表列出不同的字符编码的BOM 编码 BOM (十六进制) BOM (十进制) CP1252 字符 UTF-8[t 1] EF BB BF 239 187 191 ??? UTF-16 (BE) FE FF 254 255 t? UTF-16 (LE) FF FE 255 254 ?t UTF-32 (BE) 00 00 FE

什么是BOM头(字节顺序标记(ByteOrderMark))

在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑utf-8编码后执行就会出错的原因了.其实UTF-8 的BOM对UFT-8没有作用,是为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行. 类似WINDOWS自带的记事本等

[解决]JS失效,提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8

上网找了找,木有找到相关的解决办法,索性自己试了试. 原页面是这样写的: <html> <head> <meta http-equiv="Content-Type" content="text/html charset=UTF-8" /> <script type="text/javascript" src="js1.js"></script> <script

刨根究底字符编码之十一——UTF-8编码方式与字节序标记

UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式.UTF-8应该是目前应用最广泛的一种Unicode编码方式(但不是最早面世的,UTF-16要早于UTF-8面世).它是一种使用8位码元(即单字节码元)的变宽(即变长或不定长)码元序列的编码方式. 由于UTF-16对

理解字节序 [Understanding Big and Little Endian Byte Order]

原文地址 (本文对于字节序讲解的很清楚,容易理解.) Problems with byte order are frustrating, and I want to spare you the grief I experienced. Here's the key: Problem: Computers speak different languages, like people. Some write data "left-to-right" and others "rig

UTF的字节序和BOM

UTF的字节序和BOM UTF-8UTF的字节序和BOM以字节为编码单元,没有字节序的问题.UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序.例如收到一个"奎"的Unicode编码是594E,"乙"的Unicode编码是4E59.如果我们收到UTF-16字节流"594E",那么这是"奎"还是"乙"? Unicode规范中推荐的标记字节顺序的方法是BOM.BOM

大端模式与小端模式、网络字节顺序与主机字节顺序

大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit  ------- 最高有效位     LSB:Least Significant Bit ------- 最低有效位 大端模式(big-edian) big-endian:MSB存放在最低端的地址上. 举例,双字节数0x1234以big-endia

大端模式和小端模式 网络字节顺序与主机字节顺序

在 各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机 通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特.字节.字.双字等等)应该以什么样的顺序进行传送.如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败.目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先从字节序说起.一.什么是字节序字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的