开启左侧

非法字符 原因 以及解决办法

  [复制链接]
67020 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  ; i( P8 E, y0 }2 u) V5 f/ \0 L
# t  u  ]0 g+ R, Q
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
' n7 X2 U- I* U6 G
2 Y) v( e3 C7 u+ J0 ?8 W它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
8 c% g& r* X5 V% v* ^2 U- F% w3 F' x: _) R7 F! |
对于一般的文件,这样并不会产生什么麻烦。
! x+ C4 `0 r& f( n1 x, i- h4 W0 T+ X2 M6 ]8 H* j( ~
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
' q: }# M; H2 E( l1 K2 {2 U4 w, d3 Q. L) h0 J1 u: V5 i) W
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
7 N6 _; c! Q5 ~2 m) \# D( E( Q
1 N8 @# y* a! r" z& m由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!. C# e4 i3 Z4 m* `

& e( {( j; D0 V" \- G5 c直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
1 }$ A# U% S9 \/ p, L
3 |9 z, |0 k& Q然而文件比较多,又想偷懒下,使用下列方法来实现。  
4 O( ?, d' X+ d1 q9 G' [2 Q0 ]( L! f7 F9 `( r4 F( N5 y7 H7 H
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# M6 @9 r" J2 [
# ~7 F  Y3 x" \) k
7 p* z2 T- b! p0 n' x
  1. <?php 0 ~- U  R6 k7 C
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    5 Z; c* d7 x7 |; n8 n- U5 K, J5 K0 w
  3. $HOME = dirname(__FILE__);6 V) k7 X. k+ w# R9 t" H3 O
  4. // 如果是Windows系统,修改为:$WIN = 1;
    2 I6 Z, @  d) `0 t
  5. $WIN = 0;
    + S1 q: J# _( Y" b, F5 H- j4 x
  6. ?>
      j: P4 c7 Q5 `+ k' ~5 n
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">0 U2 K4 F. `/ a" a9 i. W! a& J( Y2 w
  8. <html xmlns="http://www.w3.org/1999/xhtml">6 k6 a- b1 |* |+ X3 m$ C8 x- ]
  9. <head>
    5 ?4 j# v, E' w7 N
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ' P6 X7 u* L3 t3 o5 v, Y
  11. <title>UTF8 BOM 清除器</title>( e5 l' X1 d/ M( v+ y
  12. <style>  M8 F2 Q* i* X; F
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    2 i! C" m8 }. a6 [/ j9 e$ n
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }# z" n& C6 U3 D: N9 j
  15. </style>0 L, s9 m! j; K9 w/ ^
  16. </head>" Y8 n) g2 P  Y$ [( u# j# ?
  17. <body>- ]- h. ~2 }. h, @3 L, k
  18. <?php
    6 I0 d! \# I" p; b# C: ]& ^1 c
  19. $BOMBED = array();
    , n- [! v) N% z$ w0 Z
  20. RecursiveFolder($HOME);
    - N# L: d9 s& A' s& ]
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';0 q! [2 C/ p& i
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }$ v, d5 V* ]7 U+ R6 Z) i
  23. echo '</p>';
    , Z7 m# [. i" e5 E+ G* [$ c
  24. // 递归扫描; t- a0 d8 N3 W; ]) R% P
  25. function RecursiveFolder($sHOME) {! Y7 @+ f" Q, O- Y
  26. global $BOMBED, $WIN;  S" V, C- |8 u6 U/ Q
  27. $win32 = ($WIN == 1) ? "\" : "/";
    , V9 o) J& F& V! l
  28. $folder = dir($sHOME);3 v$ Z+ }1 x" ]% H- Q& I$ ^
  29. $foundfolders = array();. X2 n' w) Z( }' X" R* |
  30. while ($file = $folder->read()) {& E( X6 N8 }. J9 [
  31.   if($file != "." and $file != "..") {
    6 U) A5 ~7 [, _7 n- |
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){6 P4 E* u+ L; y# R, L* G
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    6 x2 R9 G1 R  I$ A' X* S
  34.    } else {
    ) D- p3 @! t, r7 \1 a) y' G
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    9 }& ]  j$ _5 A6 N+ C
  36.     $BOM = SearchBOM($content);
    * C$ v& A3 z, Z$ x
  37.     if ($BOM) {
    / n$ ~- H/ X5 p: L3 |. G3 k
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;. a$ {. q' Y$ E% _" w4 R" }  @/ N8 c
  39.      // 移出BOM信息
    1 R; _6 I  H" j. x
  40.      $content = substr($content,3);5 W; H- ~# x- d5 m" g
  41.      // 写回到原始文件( b5 M( C% X  }
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    * f+ C0 Q: `- g. `. p* E. ~
  43.     }
    4 X: r0 b" z) J1 l1 Z' @5 s" B
  44.    }: X' H/ R- Y  H0 {2 Z  ?
  45.   }
      d1 M% C: a; t
  46. }
    ; _- W* ~5 r6 v( ^2 N4 A, M
  47. $folder->close();
    % P  e7 g2 e( }
  48. if(count($foundfolders) > 0) {: l8 [1 t$ [. X% n
  49.   foreach ($foundfolders as $folder) {% A  `: z+ t6 ^  W9 r+ z
  50.    RecursiveFolder($folder, $win32);$ v, }  u+ {; ?2 y: k: P
  51.   }1 M+ r' E6 N- O; G3 {/ f3 m) \
  52. }
    2 {) }4 ?& f1 m/ E
  53. }3 E8 n! O' l) N; Y
  54. // 搜索当前文件是否有BOM
    * p: I  w$ j) P
  55. function SearchBOM($string) {
    6 I! f' x5 ^+ h6 f3 j5 |8 v! w
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;+ q& ~% i9 i- Q; U! O5 _
  57.   return false;
    1 W( i- G4 a$ D; P
  58. }
    . }2 f& g0 ?( \! Q6 E0 _
  59. ?>
    * s( D' ^: _; s, c
  60. </body>
    ) q8 A# S5 P  R
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!/ P* i3 z1 n! k4 ~9 d

5 N0 _% |: P! V

本帖子中包含更多资源

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

x
收藏
收藏0
分享
淘帖0
支持
支持0
反对
反对0
回复

使用道具 举报

精彩评论115

跳转到指定楼层
沙发
9x06k1t2j1 发表于 2017-11-21 21:40:19 | 只看该作者
确实不错,顶先
回复

使用道具 举报

板凳
z54012ce5i 发表于 2017-11-21 23:46:00 | 只看该作者
……
回复

使用道具 举报

地板
0c923d0rh7 发表于 2017-11-22 12:53:01 | 只看该作者
佩服佩服!
回复

使用道具 举报

5#
sl46h92w29 发表于 2017-11-22 19:52:57 | 只看该作者
是爷们的娘们的都帮顶!大力支持
回复

使用道具 举报

6#
zf05f43b2y 发表于 2017-11-23 04:20:01 | 只看该作者
我也来顶一下..
回复

使用道具 举报

7#
1g27uj781t 发表于 2017-11-23 11:37:56 | 只看该作者
沙发???
回复

使用道具 举报

8#
00851v3lgq 发表于 2017-11-24 11:25:22 | 只看该作者
……
回复

使用道具 举报

9#
47l53797e3 发表于 2017-11-24 13:42:15 | 只看该作者
学习下
回复

使用道具 举报

10#
b8i2oq76av 发表于 2017-11-26 04:36:31 | 只看该作者
围观 围观 沙发在哪里!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注

粉丝

帖子

发布主题
推荐阅读 更多
阅读排行 更多
精彩推荐
关闭

欢迎大神访问! 常来~上一条 /1 下一条

扫码联系微信

QQ号1:864750570

QQ号2:736375048

联系其一即可,YES~

QQ群9:752758310

管理QQ:

864750570

(有事咨询、留言,请直奔主题)
广东省深圳市南山区科智路08号
864750570@qq.com

手机版-小黑屋- 程序源码论坛  

Powered by king X 3.4© 2016-2023 www.cx1314.cn Inc.