领行企创

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 366|回复: 0

[技术] 网页顶部空行, 非法字符 原因 以及解决办法

[复制链接]
长老| 寿元(0 )
上海·教育·运营
聚城创盟 发表于 2022-11-10 02:31:19 | 显示全部楼层 |阅读模式

马上注册,获取更多创业资源,认识更多朋友!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 聚城创盟 于 2022-11-10 02:41 编辑

模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。

    这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!

直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)

  然而文件比较多,又想偷懒下,使用下列方法来实现。

  将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换

  1. <?php
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
  3. $HOME = dirname(__FILE__);
  4. // 如果是Windows系统,修改为:$WIN = 1;
  5. $WIN = 0;
  6. ?>
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  8. <html xmlns="http://www.w3.org/1999/xhtml">
  9. <head>
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  11. <title>UTF8 BOM 清除器</title>
  12. <style>
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
  15. </style>
  16. </head>
  17. <body>
  18. <?php
  19. $BOMBED = array();
  20. RecursiveFolder($HOME);
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
  23. echo '</p>';
  24. // 递归扫描
  25. function RecursiveFolder($sHOME) {
  26. global $BOMBED, $WIN;
  27. $win32 = ($WIN == 1) ? "\" : "/";
  28. $folder = dir($sHOME);
  29. $foundfolders = array();
  30. while ($file = $folder->read()) {
  31.   if($file != "." and $file != "..") {
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
  34.    } else {
  35.     $content = file_get_contents($sHOME . $win32 . $file);
  36.     $BOM = SearchBOM($content);
  37.     if ($BOM) {
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
  39.      // 移出BOM信息
  40.      $content = substr($content,3);
  41.      // 写回到原始文件
  42.      file_put_contents($sHOME . $win32 . $file, $content);
  43.     }
  44.    }
  45.   }
  46. }
  47. $folder->close();
  48. if(count($foundfolders) > 0) {
  49.   foreach ($foundfolders as $folder) {
  50.    RecursiveFolder($folder, $win32);
  51.   }
  52. }
  53. }
  54. // 搜索当前文件是否有BOM
  55. function SearchBOM($string) {
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
  57.   return false;
  58. }
  59. ?>
  60. </body>
  61. </html>
复制代码
代码测试过,可以用!
招募兼职编辑、php技术、美工、策划,有意向的联系客服!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|领行 ( 鄂ICP备2023009750号 )

GMT+8, 2024-12-23 19:22 , Processed in 0.039611 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表