Wordpress中要注意的UTF-8的BOM问题

很早就遇到过一个问题,就是安装某个插件后,点激活后会出现白屏。一直没有搞明白是由于什么原因,以前的解决办法是,如果是不包含中文字符的,直接把文件转存成ASCII码方式,一般都能解决。今天给弟弟弄Blog的时候,又出现了这种情况。研究了半天,终于找到了答案。

Unicode规范中有一个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来标记文本文件的编码方式的。

另外unicode网站的FAQ-BOM详细介绍了BOM。官方的自然权威,不过是英文的,看起来比较费劲。

UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码,很多软件还要求读入的文件必须带BOM。可是,还是有很多软件不能识别BOM。我在研究Firefox的时候就知道,在Firefox早期的版本里,扩展是不能有BOM的,不过Firefox 1.5以后的版本已经开始支持BOM了。现在又发现,PHP也不支持BOM。

PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以这三个字符将会直接输出。如果插件的文件有这个问题,将会导致在后台页面里激活或者不激活插件后显示白屏,如果是模版文件有这个问题,将会导致这三个字符直接输出,造成页面上方有一个小空行。国外的英文插件和模版一般都是用的ASCII码的编码方式,不会有BOM,只有国内的插件和模版会由于作者的不知情造成问题。还有,大家修改模版的时候,由于输出页面使用UTF-8编码,那么修改模版的时候如果有加入中文字符的话,必须把文件转成UTF-8编码才能正常显示,这个时候如果所使用的编辑器自动加上了BOM的话,将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。

在Bo-Blog的wiki看到,同样使用PHP的Bo-Blog也一样受到BOM的困扰。其中有提到另一个麻烦:“受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。”这个应该就是Wordpress后台出现空白页面的原因了,因为任何一个被执行的文件包含了BOM,这三个字符都将被送出,导致依赖cookies和session的功能失效。

解决的办法嘛,如果只包含英文字符(或者说ASCII编码内的字符),就把文件存成ASCII码方式吧。用UE等编辑器的话,点文件->转换->UTF-8转ASCII,或者在另存为里选择ASCII编码。如果是DOS格式的行尾符,可以用记事本打开,点另存为,选ASCII编码。如果包含中文字符的话,可以用UE的另存为功能,选择“UTF-8 无 BOM”即可。请参考下面的图片: UTF-8 BOM

根据Bo-Blog的wiki的说明:Editplus需要先另存为gb,再另存为UTF-8。不过这样做要小心,所有GBK编码中不包含的字符就会都丢了。如果有一些非中文的字符在文件里的话还是不要用这种办法了。(从这一个小方面来看,UE——UltraEdite-32确实比Editplus好很多,Editplus太轻量级了)

另外我发现了一个办法,就是利用Wordpress提供的文件编辑器。这个办法不受限制,不需要去下载专门的编辑器,毕竟大家都在用Wordpress嘛。先在ftp里把要编辑的文件的写入权限打开,然后进入Wordpress后台->管理->文件编辑器,输入要编辑文件的路径,点编辑文件。在显示出来的编辑界面中,你是看不到开头的那三个字符的,不过没关系,把光标定位在整个文件的第一个字符前,按一下Backspace键。OK了,点更新文件吧,在ftp里刷新一下,可以看到文件小了3字节,大功告成。

最后说一下,这是个大问题,所有要自己写插件的,编辑别人的插件自己用的,需要修改模版的(这条估计每个人都需要吧),最好了解一下上面的知识,免得出现问题时不知所措。

本文共有 32 条评论Wordpress中要注意的UTF-8的BOM问题


  1. 1 scavin

    请问下我每次发布完文章的时候偶尔也会出现白屏,需要修改哪个文件啊

  2. 2 yskin

    偶尔出现的吗?如果有BOM头的话应该会在进行某些操作时必然出现白屏才是。
    发布或编辑完文章保存的时候,Wordpress会做一个操作:自动ping一些地址,以便通知它们过来更新。到选项->录入->更新服务里看一下,是不是加了过多更新地址。尤其不能加的是http://rpc.technorati.com/rpc/ping,因为大陆访问不到technorati。我只加了http://ping.feedburner.com/,然后在feedburner里设置自动ping其他的一些地址,包括technorati,这样就不怕GFW了 :D scavin去看看是不是这个原因。

  3. 3 Calon

    Edit Plus 做不来?那么还是 EmEditor、Scite 或 Notepad 更好。UE 虽好,要收费啊

  4. 4 yskin

    嗯,是收费。而且我用的还是UEStudio(¥1000),比UltraEdit-32(¥400)还要贵一倍多。不过当时在华军下载了烈火汉化的UEStudio 05.50+1简体中文增强版,安装完后直接弹出了一个keygen小程序,所以我就...T_T 等有钱了俺一定支持正版。

  5. 5 ZWQ

    VIM就不会产生BOM,还是免费的

  6. 6 baozhu

    网站配色不好,影响浏览。建议改进。

  7. 7 yskin

    配色倒是没啥问题,问题在于你的页面没打开完全吧。

  8. 8 炎藤

    是这样哟,谢谢

  9. 9 sunu

    非常感谢!

  10. 10 匿名

    感觉你截图有点罗嗦,但是正是你的罗嗦,为我指点迷津,谢谢!

  11. 11 匿名

    告诉你个办法,
    每个header里加上 ;charset=utf-8

  12. 12 笑嘻嘻

    非常感谢,我最近在用header()函数跳转页面时也碰到了,看了这篇文章解决了

  13. 13 lord

    谢谢啊,让我知道了为什么我的flash无法在IE6打开,白屏

  14. 14 do4ucn

    太谢谢你了!!!我的feed问题终于解决了!!!!!!就是BOM的问题,晕死。

  15. 15 Atkinson Country Club Nh

    Hey!...I Googled for atkinson country club nh, but found your page about nnial 2007 - salvatore iaconesi - del.icio.us poetry...and have to say thanks. nice read.

  16. 16 We

    谢谢了,找到问题了,呵呵

  17. 17 梦想家

    真的很感谢,又帮我解决一个问题

  1. 1 BloggingPro China » Blog Archive » Wordpress中要注意的UTF-8的BOM问题
    Pingback2006-7-30 9:58 下午
  2. 2 网络创造未来! » Blog Archive » links for 2006-08-03
    Pingback2006-8-3 11:24 上午
  3. 3 SEO探索
    Trackback2006-9-3 2:46 下午
  4. 4 Unlockey.com » Blog Archive » Warning: Cannot modify header information - headers already sent by (output started at
  5. 5 PlanABC-落草为根 >> Blog Archive » Improve the function of blog
    Pingback2006-10-29 6:47 下午
  6. 6 Warning: Cannot modify header information at 刘杰
  7. 7 sein » Blog Archive » wordpress 修改文件后台登录白屏
    Pingback2007-2-17 12:55 下午
  8. 8 0,1之结» Blog Archive » 升级博客后,出现的错误!
    Pingback2007-4-4 11:14 下午
  9. 9 doubaba » Wordpress中要注意的UTF-8的BOM问题
    Pingback2007-4-17 1:02 上午
  10. 10 价值网Blog系统 » Blog 存档 » Warning: Cannot modify header information - headers already sent by (output started at
    Pingback2007-5-26 9:03 下午
  11. 11 easelab.org » Blog Archive » 问题解决
    Pingback2007-6-14 1:10 下午
  12. 12 阿邙-離離濁濁... » 一个Warning
    Pingback2007-6-24 5:22 上午
  13. 13 技术 » PHP源代码文件存成utf-8后
    Pingback2008-2-1 4:50 下午
  14. 14 LuoFei’s Blog » Warning: Cannot modify header information - headers already sent by (output started at…
    Pingback2008-5-19 9:29 下午
  15. 15 解决wordpress安装后进入后台时Warning: Cannot modify header information - headers already sent… | iSkyfuliN's Blog!
    Pingback2008-5-21 4:42 下午

请留下您的评论: