前几天我终于把困扰已久的主题变形问题解决了,并最终判断是utf8惹得祸。

当时我是打开每个文件,检查编码,如果不对的就另存为正确的编码。不过这样十分麻烦,而是浪费时间。好在要处理的文件不多,而且是一次性操作,也就没管了。

今天看到一段不错的php程序,可以自动把你所有的文件的BOM去掉,而这全部过程只需要上传并运行一下,非常不错,保留下来方便下次使用。

另外,对于ultraedit的用户来说,可以在ultraedit.ini中修改一下设置,这样就不用每次都特别留意这个问题了。

Write UTF-8 BOM=0
Write UTF-8 BOM NF=0

这段php程序如下,保存成php文件放在根目录中执行一次就行了,会自动去除文件头中的BOM。

   1: <?php
   2: //remove the utf-8 boms
   3: //by magicbug at gmail dot com
   4:  
   5: if (isset($_GET['dir'])){ //config the basedir
   6:     $basedir=$_GET['dir'];
   7: }else{
   8:     $basedir = '.';
   9: } 
  10:  
  11: $auto = 1; 
  12:  
  13: checkdir($basedir);
  14:  
  15: function checkdir($basedir){
  16:     if ($dh = opendir($basedir)) {
  17:         while (($file = readdir($dh)) !== false) {
  18:             if ($file != '.' && $file != '..'){
  19:                 if (!is_dir($basedir."/".$file)) {
  20:                     echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";
  21:                 }else{
  22:                     $dirname = $basedir."/".$file;
  23:                     checkdir($dirname);
  24:                 }
  25:             }
  26:         }
  27:     closedir($dh);
  28:     }
  29: }
  30:  
  31: function checkBOM ($filename) {
  32:     global $auto;
  33:     $contents = file_get_contents($filename);
  34:     $charset[1] = substr($contents, 0, 1); 
  35:     $charset[2] = substr($contents, 1, 1); 
  36:     $charset[3] = substr($contents, 2, 1); 
  37:     if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
  38:         if ($auto == 1) {
  39:             $rest = substr($contents, 3);
  40:             rewrite ($filename, $rest);
  41:             return ("<font color=red>BOM found, automatically removed.</font>");
  42:         } else {
  43:             return ("<font color=red>BOM found.</font>");
  44:         }
  45:     } 
  46:     else return ("BOM Not Found.");
  47: }
  48:  
  49: function rewrite ($filename, $data) {
  50:     $filenum = fopen($filename, "w");
  51:     flock($filenum, LOCK_EX);
  52:     fwrite($filenum, $data);
  53:     fclose($filenum);
  54: }
  55: ?>

这里有保存好的php文件,下载回来直接用就可以了。

PS:首次在WLW中用Code Snippet插入代码,看看效果如何。没有PHP类型选,只能选了一个相近的类型高亮代码。

Popularity: 18%

Del.icio.us Google书签 百度搜藏 QQ书签 添加到饭否 该页面添加到 Mister Wong Live Bookmark Facebook 新浪ViVi Digg Digbuzz我挖网 Technorati Yahoo书签 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘

可能还感兴趣

“用php把utf8的中的BOM去掉”有 7 个评论

» 欢迎发表评论发送Trackback

  1. jason

    其实就是去掉文件的头三个字节而已

    回复

    Black-Xstar2008-05-06 11:47 下午 回复:

    原理我知道啊。
    我不介意你用其它语言重写一遍并编译成可执行文件……
    别忘了在我这里首发啊。 :mrgreen:

    回复

  2. MoontoC

    寒, 写php自然要去掉bom,常识话题了-_-,没啥必要单独个程序来作,啥编辑器都有,除了windows的

    另外这程序效率好差,既然是有了fopen,就不该还有一个file_get_contents,

    就一个fopen,用读写方式而不是用单纯的写方式,

    操作一个文件还要加载两次,这效率-_-

    回复

    Black-Xstar2008-05-07 1:20 下午 回复:

    唉,我是刚刚接触这些方面,所以很多东西不懂。
    正在努力学习呢……

    PS:你的blog居然还要注册,而且当我尝试注册老说验证码错误。

    回复

    MoontoC2008-05-08 7:11 上午 回复:

    需要注册是早期的从DH搬到国内服务器之后发现spam这样作的,现在貌似没必要了,不过验证码错误你可能是没把画面往下拉吧,验证码写在最下面的,,

    不过无所谓,我把验证码去掉了,也开放了,不注册也可以评论了,反正评论本身就是不计数的

    回复

    Black-Xstar2008-05-08 12:29 下午 回复:

    我看到了验证码,绝对正确输入了…… :wink:

  3. 时光漂流瓶

    如果涉及的php文件比较多的话,这段php代码还是有些用处的。

    回复

» Trackbacks/Pingbacks

发表评论