WordPress网页源代码乱码-发现并解决问题

昨日惊奇发现本博在IE下查看源代码时,中文显示全部为乱码。本以为是最近安装插件后导致的问题,仔细一想,可能这个问题存在已久,且与博客在百度较长时间收录较差有莫大关联(谷歌没问题,显示了技术强悍)。因此心底不禁发凉,这么严重的问题竟然到现在才发现,估计有一个月左右时间,平日用Opera浏览,查看源代码并无问题。

接下来解决问题过程中发现了很多有意思的东西,用Editplus把theme中相关php文件全部另存为UTF-8格式,上传后问题依旧。接着再次下载检查文件,发现编码又变回ANSI,检查上传文件发现Editplus根本就没有保存为UTF-8格式,由此得出结论,Editplus并非想象中那么可靠,过分信任某东西的后果是严重的。

网上下载了一个批量编码转换的小程序,使用后编码全部转换为UTF-8,但网页变得很不正常,表现为页面顶部增加一行空白,用备份的文件替换转换后的header.php,single.php后一切恢复。问题原因大概是批量转换工具将php文件中的空白字符变为一种浏览器可误读的字符,产生空白。

此次修改问题:IE下网页正常,源代码乱码

问题原因:风格php文件与网页编码不同

解决:将风格中php文件另存为UTF-8格式

获得经验:1.Google对于网页编码兼容性标准性强于百度

2.Editplus在另存文件选择格式处存在问题,有时不能按所选格式保存

3.批量转换编码的工具慎用,用前必须备份文件

=============问题深入

继续修改发现此问题的关键因素是UTF-8 BOM,对于WordPress,其中模板文件夹下function.php文件是关键,将此文件保存为带BOM的UTF-8文件,则用IE(更准确说是用notepad)查看文件源代码时可以正常显示;如果保存为不带BOM的UTF-8,IE(notepad)可以正常显示,而WordPress后台无法正常登录,Windows Live Write也无法连接。

此问题根本原因是PHP不支持BOM,同时NOTEPAD无法识别无BOM的UTF-8。

关于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的话,将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。

5 Comments

Zhang十二月 3rd, 2007 at 10:16 上午

你说的问题我都遇到过, 包括源代码乱码, 多字符, 甚至空白页面. 最后似乎都是文件格式的问题. 我从来没用过中文包, 不应该中文包的问题.

MiniJava » Blog Archive » Hello world!三月 7th, 2008 at 11:14 上午

[...] WordPress网页源代码乱码-发现并解决问题| grick’s blog [...]

Betty十一月 16th, 2008 at 10:16 下午

google了一番,还是你这篇好 :)
function.php存成带BOM的utf-8格式,就一切正常了~谢谢你啦~~

lostindream十二月 6th, 2008 at 1:53 下午

我的还是乱码,解决不了,求助阿

Leave a comment

Your comment