近日在调测一个UTF8编码的中文Zen Cart网站时遇到一件怪事,网页显示文字正常,用ie的察看源文件(记事本打开)却发现乱码,firefox没有这个问题。经在网上多方查证和多次测 试,解决了这个问题,其实是UTF-8文件的Unicode签名BOM(Byte Order Mark)问题。
BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测, 而把它当作正常字符处理。
微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。
也 就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模 式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。
我找到Zen Cart的模版文件中的html_header.php,发现文件果然不带BOM,用UltraEdit-32另存为的方式加上BOM后,再上传html_header.php,一切正常。
注 意用Convertz把gb2312文件转换成UTF-8文件时,默认设置是不带BOM的。不带BOM可能出现上述乱码问题,但是带 BOM,对于php的include文件要小心,会在php字节流前面多出EF BB BF,提前输出到显示器有可能会带来程序错误。一个解决方案是凡是被include的文件都保存为ANSI,主文件可以是UTF-8。要想把一个文件去掉 BOM,使用UlterEdit打开, 切换到十六进制编辑模式,把最前面三个字节(就是那该死的 EF BB BF)替换为20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了。
另 外还学到一些编码的小知识:所谓的unicode保存的文件实际上是utf-16,只不过恰好跟unicode的码相同而已,但在概念上unicode与 utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。非unicode官方的utf编码还有utf-7,主要用于邮件传 输。utf-8的单字节部分是和iso-8859-1兼容的,这主要是一些旧的系统和库函数不能正确处理utf-16而被迫出来的,而且对英语字符来说, 也节省保存的文件空间(以非英语字符浪费空间为代价)。在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它 字符的时候,utf-8会使用两个或三个字节
转自 :http://blog.163.com/result_2205/blog/static/13981945020102954023564/
分享到:
相关推荐
UTF-8签名(UTF-8 signature)也叫做BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记。BOM,是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是...
在探讨《PHP中的Unicode签名(BOM)问题》这一主题时,我们首先需要理解几个关键概念:Unicode、UTF-8以及BOM(Byte Order Mark)。Unicode是一种国际标准字符集,旨在支持世界上所有语言的文字,而UTF-8是Unicode的一...
在处理文本文件时,特别是使用UTF-8编码的文件时,我们可能会遇到一个特殊的问题,那就是文件头部的Unicode签名(Byte Order Mark,简称BOM)。BOM是UTF-8、UTF-16或UTF-32编码的文件开头用来标识字节顺序的一个特殊...
标题中的“无头BOM的UTF8文件判断”是指在处理UTF-8编码的文本文件时,关注那些没有字节顺序标记(Byte Order Mark,简称BOM)的文件。BOM是一个可选的Unicode签名,通常出现在文件的开头,用于标识文件采用的字符...
在Java编程中,处理文本文件时,我们可能会遇到BOM(Byte Order Mark)头信息的问题。BOM是Unicode编码格式中的一个特殊字符,用于标识文件的编码类型,常见于UTF-8、UTF-16和UTF-32等格式。在某些情况下,如读取或...
1. **什么是BOM**:BOM,全称Byte Order Mark,是Unicode编码格式的一个特殊字符,用于指示文件的字节顺序。UTF-16和UTF-32编码通常包含BOM,而UTF-8编码可以包含但不是必须的。在UTF-8中,BOM的字节序是EF BB BF。 ...
BOM是Unicode编码中的一个特殊字符,它的Unicode码点是`U+FEFF`,在UTF-8编码中,BOM的字节序列是`EF BB BF`。BOM的主要作用是在数据传输或存储时标识文件或数据流的字符编码,尤其是区分大端序(Big-Endian)和小端...
常见的BOM字符有UTF-8的EF BB BF,UTF-16BE的FE FF,以及UTF-16LE的FF FE。它们并不占用实际的字符位置,但在文件或数据流的开头出现,用于告知软件文件的编码方式。 1. **BOM的作用** - **标识编码**:BOM的存在...
在编程世界中,BOM(Byte Order Mark)是Unicode字符集中的一个特殊字符,用于标识文件的编码方式。尤其在处理UTF-8编码的文本文件时,BOM常常会在文件的开头出现。对于PHP开发者来说,BOM可能会引起一些不必要的...
BOM(Byte Order Mark)头,也称为字节顺序标记,是Unicode编码格式的一个特殊字符。它通常出现在UTF-8、UTF-16和UTF-32编码的文件开头,用于标识文件所使用的字符编码类型。在UTF-8编码中,BOM头由三个字节构成:EF...
"BOM"是Byte Order Mark的缩写,它是Unicode字符集中的一个特殊字符,用于标识文件是以哪种字节顺序(Big-Endian还是Little-Endian)编码的。在UTF-8编码中,BOM头通常表示为EF BB BF这三个字节。然而,某些程序或...
2. **Byte Order Mark (BOM)**:BOM是Unicode字符集中的一个特殊序列,用于标识字节顺序。在UTF-16和UTF-32编码中,字节顺序很重要,但在UTF-8编码中,字节顺序并不重要,因为其字节顺序是固定的。然而,有些编辑器...
在IT行业中,BOM(Byte Order Mark)是一个特殊字符,主要用于标识文本文件的编码格式,尤其是在UTF-8编码中常见。BOM头并不是必须的,但在某些情况下可能会引起问题,例如在JavaScript处理JSON数据或者在网页显示...
这个场景中,我们面临的挑战是如何正确处理UTF-8带有BOM(Byte Order Mark)的文件,因为BOM可能会导致文件内容显示为问号或者其他乱码。下面将详细介绍如何解决这个问题。 首先,我们需要理解什么是UTF-8的BOM。...
在IT行业中,BOM(Byte Order Mark)是一个重要的概念,特别是在处理Unicode文本文件时。BOM是用来标识文本文件字符编码顺序的特殊字符。在标题"BOM.rar_BOM_bom.rar_visual c"中,我们可以推断这是一个与Visual C++...
BOM(Byte Order Mark)是Unicode编码中的一个特殊字符,用于标识文本的字节顺序。在某些情况下,BOM可能会引起不必要的问题,比如在一些文本编辑器中显示异常或者导致解析错误。因此,有时候我们需要批量去除文件中...
然而,UTF-8编码有一个特性,就是对于某些文件,尤其是文本文件,可能会带有“BOM”(Byte Order Mark),也称为字节顺序标记。 BOM头是UTF-8编码的一个可选部分,用于标识文件的编码方式。它的字节序列是`EF BB BF...
BOM(Byte Order Mark)是 Unicode 编码的字节顺序标记。 BOM 用于标记 Unicode 编码的字节顺序,防止乱码的问题。 在 Windows 记事本中,我们可以使用“另存为”功能将 txt 文件转换为不同的编码方式,如 GBK、...
对于UTF-8编码来说,BOM标记为`EF BB BF`。虽然在大多数情况下BOM不会对文本内容造成影响,但在某些特定环境下,如HTML文件,BOM可能会被浏览器误解析为文件的一部分,从而导致页面显示不正常。 #### PHP脚本实现 ...