开启左侧

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

  [复制链接]
64997 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  9 R9 W$ b' t% A

$ [! [5 V; w/ n( d1 s这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
3 b" m- r; P! @
% T7 X" }5 C" ~# x! E; D1 y它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! Z1 t$ n/ l1 t$ x/ h2 @& o4 Q/ s

' J# k6 `& a5 N7 b3 H! ~$ ?对于一般的文件,这样并不会产生什么麻烦。" @* Y: O- P( X+ T3 X

% A$ O" ?% E, x但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
9 g# W/ y. r9 y4 v% q/ s" ~' q/ I
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
7 A# Z) J8 j' Q! K+ T* c; B7 {0 ~9 \& m5 t' l; q
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!! y! ]1 ]7 z% e& f5 n' L# F
& A2 x4 ^1 G/ K; K% |2 I5 k+ p3 f0 i
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ) P+ H0 N0 f7 Q& G, h0 a' |
% s+ _5 R( F9 X+ ~4 p( e& ~& U
然而文件比较多,又想偷懒下,使用下列方法来实现。  - }( t$ a1 z3 s$ _+ q) A* n
# |& ]* ~) D/ H- e; s
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
6 T. C5 T, ?! I0 \6 z4 h
1 K- M6 ]2 a/ M; a- u7 y9 i) k$ V# V6 c% `# k( p4 L. U8 @
  1. <?php
    ! W- I) Y! w, q' i" ~9 `
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)  |% R) \: Q. i0 Z3 d2 J) T, a
  3. $HOME = dirname(__FILE__);2 |6 M1 ^  v" `1 L5 t
  4. // 如果是Windows系统,修改为:$WIN = 1;
    3 a; P9 x, n# r6 ~& ]1 v, U
  5. $WIN = 0;
    , }: x3 K- C* I( y
  6. ?>
    7 M  o8 `2 f7 ^# g
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    , F: y+ G# Z8 ~, X+ R7 ^
  8. <html xmlns="http://www.w3.org/1999/xhtml">% u) ]2 |# C0 i* U, p0 v
  9. <head>
    ! c) f9 e% x( h- ]3 |9 h- F5 t
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />% R0 u) `5 z6 R$ ]/ R& z: ?
  11. <title>UTF8 BOM 清除器</title>$ G4 P$ R% @% a4 P% u* s% l% N+ b
  12. <style>
    . x8 i8 u! J8 n4 b! x- u2 p
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }7 M( Z- |% ~( H# D. |9 c' c
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    & V" t% ^7 l: {2 a! Z" v
  15. </style>
    % }! ^6 ^1 _+ X+ d* S. B; U. l) d
  16. </head>$ D" q0 [. Q# ~1 @, z
  17. <body>
    4 @* j5 `3 @) `9 k8 {
  18. <?php
    $ h8 _( H. H/ Z# p
  19. $BOMBED = array();
    / m, N) k! P1 b, o- v
  20. RecursiveFolder($HOME);
    " A; z( q4 j0 Q  T9 E* ^5 n
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';, h' R6 a2 n5 |( G
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    # Q1 P; j( f( Z0 E: v
  23. echo '</p>';
    ) \6 V& \5 t% ]2 M5 {, c: Q
  24. // 递归扫描0 e. u1 k, I3 A+ r) k: |% h
  25. function RecursiveFolder($sHOME) {
    ! `6 O8 T2 m* S( f
  26. global $BOMBED, $WIN;
    2 D5 y. _( b! a" w% p4 {4 D
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ( i" k. t4 T- M) Y1 h4 x
  28. $folder = dir($sHOME);5 g  D0 Z8 V8 R0 n7 ^
  29. $foundfolders = array();
    2 \: x) A% {. N' M5 _/ L2 |. V: J
  30. while ($file = $folder->read()) {; H' U( \3 R7 ]
  31.   if($file != "." and $file != "..") {
    , C) s; {* M4 T7 s
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){0 X% n' Z! ^# W' z; ^
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;3 Y2 y) d7 Y# z8 S% |
  34.    } else {
    / z  ]* k. B0 y  ]1 B% m
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ! \, a) Z5 F' N; r9 E: J
  36.     $BOM = SearchBOM($content);
    % Z' Q9 V3 c, R* E" E
  37.     if ($BOM) {
    8 U) {* v6 l9 d/ T- j
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;# m  r( u2 X2 Q: q" K: ?$ H. D" P, |
  39.      // 移出BOM信息6 |" x/ Q+ Z; l8 y6 |6 Y' r
  40.      $content = substr($content,3);6 |! Y8 Z5 s- K( C
  41.      // 写回到原始文件6 U) H' s( @1 L" G& B
  42.      file_put_contents($sHOME . $win32 . $file, $content);7 H+ S' w+ u# r# _$ v) y5 u1 u( J
  43.     }+ X7 @% t* K3 S) S8 n2 X0 ~5 t
  44.    }
    $ ~4 g0 k1 N/ s% K( y
  45.   }% X2 M  ?1 q0 N7 i' k8 H* |/ w
  46. }" o% k6 N0 w  C) i7 {+ O. U
  47. $folder->close();
    0 W) M; s2 H/ H+ V
  48. if(count($foundfolders) > 0) {
    + i! Y0 G1 w7 O1 b$ {. M
  49.   foreach ($foundfolders as $folder) {
      h& b( z- v+ W) }, S! o1 ?3 J" m
  50.    RecursiveFolder($folder, $win32);: ~4 V0 o( m4 C2 D1 r; F
  51.   }. {% D7 x4 _% }1 B- ?
  52. }2 z' o' P6 D, _9 ]* a
  53. }
    - D4 B2 f% Z% v6 q4 F. Z
  54. // 搜索当前文件是否有BOM
      d0 W" n( e5 g( K# g- Q
  55. function SearchBOM($string) {
    9 G4 r: m& C2 ?& e
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    9 R5 Q7 n  D) L
  57.   return false;
    / A& S/ F8 N1 W2 X' p6 Z) B
  58. }" `1 C; n% v5 v1 @2 V% ^6 X+ i; x
  59. ?>, g# ~, w, N# A  i0 f+ G" K, T
  60. </body>
    , w* W& }4 I$ u0 |! E
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
8 ?! S; X" y1 T' I/ l& e% u- F+ C
9 U% g) P# i. o4 |. R

本帖子中包含更多资源

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

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.