utf-8 是一种在web应用中经常使用的一种 unicode 字符的编码方式,使用 utf-8 的好处在于它是一种变长的编码方式,对于 ansii 码编码长度为1个字节,这样的话在传输大量 ascii 字符集的网页时,可以大量节约网络带宽。
utf-8签名(utf-8 signature)也叫做bom(byte order mark),是utf编码方案里用于标识编码的标准标记。bom,是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。
只有一个bom,是不会有问题的。如果多个文件设置了签名,在二进制流中就会包含多个utf-8签名,也就是导致xml转换失败的"root element must be well-formed"原因。
二、查看和转换
既然一个utf-8文件可能有bom,也可能没有,那该如何区分呢?
只要用带十六进制编辑方式的软件,例如,用ultraedit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有ef bb bf。有,则为带bom方式。
windows自带的notepad记事本,保存为utf-8时,默认就带bom。
转换的方法有很多,常见的ultraedit-32或notepad++都可以,以ultraedit-32为例。打开文件后,选择“另存为”,在“格式”一栏中有如下选择:
另外,dreamweaver cs3也有类似的选项,在“首选项”中,如果选择 unicode (utf-8) 作为默认编码,则可以选择“包括 unicode 签名 (bom)”选项,以在文档中包括字节顺序标记 (bom)。否则,不带bom:
三、其他知识
从http://blog.csdn.net/thimin/archive/2007/08/03/1724393.aspx 一文了解到:
所谓的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会使用两个或三个字节。
一段关于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来标记文本文件的编码方式的。
php也不支持bom。
php在设计时就没有考虑bom的问题,也就是说他不会忽略utf-8编码的文件开头bom的那三个字符。由于必须在<?或者<?php后面的代码才会作为php代码执行,所以这三个字符将会直接输出。如果插件的文件有这个问题,将会导致在后台页面里激活或者不激活插件后显示白屏,如果是模版文件有这个问题,将会导致这三个字符直接输出,造成页面上方有一个小空行。国外的英文插件和模版一般都是用的ascii码的编码方式,不会有bom,只有国内的插件和模版会由于作者的不知情造成问题。还有,大家修改模版的时候,由于输出页面使用utf-8编码,那么修改模版的时候如果有加入中文字符的话,必须把文件转成utf-8编码才能正常显示,这个时候如果所使用的编辑器自动加上了bom的话,将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。
※ 补充一句:特别是当使用php导入模板的时候,更容易因为这三个字符,导致浏览异常。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!