BOM —— Byte Order Mark,中文名译做“字节顺序标记”。在这里找到一段关于 BOM 的说明:php
在UCS 编码中有一个叫作 "Zero Width No-Break Space" ,中文译名做“零宽无间断间隔”的字符,它的编码是 FEFF。而 FFFE 在 UCS 中是不存在的字符,因此不该该出如今实际传输中。UCS 规范建议咱们在传输字节流前,先传输字符 "Zero Width No-Break Space"。这样若是接收者收到 FEFF,就代表这个字节流是 Big-Endian 的;若是收到FFFE,就代表这个字节流是 Little- Endian 的。所以字符 "Zero Width No-Break Space" (“零宽无间断间隔”)又被称做 BOM。html
UTF-8 不须要 BOM 来代表字节顺序,但能够用 BOM 来代表编码方式。字符 "Zero Width No-Break Space" 的 UTF-8 编码是 EF BB BF。因此若是接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记文本文件的编码方式的。浏览器
字符U+FEFF若是出如今字节流的开头,则用来标识该字节流的字节序,是高位在前仍是低位在前。若是它出如今字节流的中间,则表达零宽度非换行空格的意义,用户看起来就是一个空格。从Unicode3.2开始,U+FEFF只能出如今字节流的开头,只能用于标识字节序,就如它的名称——字节序标记——所表示的同样;除此之外的用法已被舍弃。取而代之的是,使用U+2060来表达零宽度无断空白。session
相似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于通常的文件,这样并不会产生什么麻烦。但对于 PHP来讲,BOM是个大麻烦。编辑器
PHP并不会忽略BOM,因此在读取、包含或者引用这些文件时,会把BOM做为该文件开头正文的一部分。根据嵌入式语言的特色,这串字符将被直接执行(显示)出来。由此形成即便页面的 top padding 设置为0,也没法让整个网页紧贴浏览器顶部,由于在html一开头有这3个字符呢!函数
编码工具 |
表示 (十六进制)编码 |
表示 (十进制)spa |
---|---|---|
UTF-8设计 |
EF BB BF |
239 187 191 |
UTF-16(大端序) |
FE FF |
254 255 |
UTF-16(小端序) |
FF FE |
255 254 |
UTF-32(大端序) |
00 00 FE FF |
0 0 254 255 |
UTF-32(小端序) |
FF FE 00 00 |
255 254 0 0 |
2B 2F 76和如下的一个字节:[ 38 | 39 | 2B | 2F ] |
43 47 118和如下的一个字节:[ 56 | 57 | 43 | 47 ] |
|
en:UTF-1 |
F7 64 4C |
247 100 76 |
en:UTF-EBCDIC |
DD 73 66 73 |
221 115 102 115 |
en:Standard Compression Scheme for Unicode |
0E FE FF |
14 254 255 |
en:BOCU-1 |
FB EE 28及可能跟随着FF |
251 238 40及可能跟随着255 |
GB-18030 |
84 31 95 33 |
132 49 149 51 |
代码的时候看到这样一段
$template_content = str_replace(”/xEF/xBB/xBF”, ”, $template_content);
不知道是何做用,通过一番查找资料,终于解开了这个疑问
资料以下:
在window下面用记事本编辑文件的时候,若是保存为UNICODE或UTF-8,分别会在文件的开头加上两个字节“/xFF/xFE”和三个字 节“/xEF/xBB/xBF”。在读取的时候就可能会遇到问题,可是不一样的环境对这几个多于字符的处理也不同。(其余的文本编辑工具也存在这个问题, 可是能够选择去除bom,如editplus的设置:参数选择->文件->utf-8, 选择老是删除签名)若是前面三个字符“/xef/xbb/xbf”则保存格式是utf-8若是前两个字符是“/xff/xfe”则保存格式是UnicodeUnicode规范中有一个BOM的概念。BOM——Byte Order Mark,就是字节序标记。在这里找到一段关于BOM的说明:在UCS 编码中有一个叫作”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,因此不该该出如今实际传输中。UCS规范建议咱们在传输字节流前,先传输 字符”ZERO WIDTH NO-BREAK SPACE”。这样若是接收者收到FEFF,就代表这个字节流是Big-Endian的;若是收到FFFE,就代表这个字节流是Little- Endian的。所以字符”ZERO WIDTH NO-BREAK SPACE”又被称做BOM。UTF-8不须要BOM来代表字节顺序,但可 以用BOM来代表编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。因此若是接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。容易致使header session_star ob_start的问题,utf-8编码的文件中,BOM占3个字节,因为php设计时没有考虑BOM的问题,这三个字节会直接输出,若是这时在程序里调用了session函数,就会出问题了附: 文件应该使用 Unicode (UTF-8) 编码保存。同时不要使用 字节序标记(BOM) 。与 UTF-16 和 UTF-32 不一样,UTF-8 编码的文件不须要指明字节序,并且 字节序标记(BOM) 在PHP中会产生预期以外的输出,阻止了应用程序设置它本身的 头信息。应该使用Unix 格式的行结束符(LF)。