开启左侧

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

  [复制链接]
64971 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
5 ^  e6 N" l9 h8 t; \) U, d  f3 V5 M. h  m6 m0 |) T) J( c4 d
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。$ u+ E2 N% f) T) h# r9 T

1 _& O3 s8 h: H- Q  Z; B它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
: ^( Q0 q6 Z+ r2 j# t  T" }/ Z) o; b. {: `2 j: }' q; u) g
对于一般的文件,这样并不会产生什么麻烦。+ B' o2 H" a' h7 s( `

2 _+ {! i$ c5 f* Z但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。: u9 M+ K3 E) n2 F" z  `3 y
6 g+ s$ A8 G' G+ `/ ]
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。$ Y& g( z& O( g: q
7 u* m7 T6 p& J+ q
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!( \/ d7 @1 e2 O( O+ R) B2 e' l

( t* F" V  O+ Q) O直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   4 S: P3 L! t) t+ L0 z7 h

3 V0 g9 o% B4 k7 r+ A5 M) s0 j然而文件比较多,又想偷懒下,使用下列方法来实现。  
/ N; [3 b$ s  h$ l* H- ~3 t# Q- z! _0 ^
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
, q6 e( U  p: z+ c, B* Z: H& l; y, w; q: S' i

: G- T" P+ j9 }: k+ b2 v8 W  {
  1. <?php
      h# J! F% |5 p5 U
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    5 [0 \7 A2 P0 s! d3 R% S$ E0 r2 Y
  3. $HOME = dirname(__FILE__);
    * d1 V1 A+ v  j' n
  4. // 如果是Windows系统,修改为:$WIN = 1;9 O3 i3 ^! A' d6 F8 l; \! F. ~% d' ]2 J
  5. $WIN = 0;8 a* l2 E4 q% V; x  w. U+ j" p/ ^
  6. ?>
    ) l6 V2 f8 |5 T3 H
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    $ o% ]8 J. L3 Y, s" N4 M- x
  8. <html xmlns="http://www.w3.org/1999/xhtml">: E  a1 S* F9 G0 r, J
  9. <head>
    + R/ Y$ h0 Z9 D: u
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ! ~( ?7 `5 v. w+ A3 I5 B6 v
  11. <title>UTF8 BOM 清除器</title>
    , l) G0 Z/ K( f9 N# r) R
  12. <style>& d0 \# C$ k. ]. f" A
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    % J* s7 f/ F- Z  S* k. y
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }7 J9 y) y" ]1 ]
  15. </style>
    ) o" O: f; R3 |8 O
  16. </head>
    ; u6 A" e  o7 P1 l* G/ }$ ]
  17. <body>
    2 [) f( j# C, G0 _# t/ `8 z
  18. <?php
    0 }. z) ~. i2 Y* H0 r3 A% s
  19. $BOMBED = array();
    & P+ i; q+ y9 S6 c! z3 M
  20. RecursiveFolder($HOME);- H. w! I- A* X. J8 Y
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    7 {8 M& q0 S4 [
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    0 r; A. p9 Q8 V4 \% T
  23. echo '</p>';
    / K9 K0 {. k4 c6 \8 I: p
  24. // 递归扫描
    ) C5 T* f. m# {% z. E% m
  25. function RecursiveFolder($sHOME) {7 @5 U7 F& w9 T' |: d& R5 U" I
  26. global $BOMBED, $WIN;" G$ e- z- T( x6 e5 s5 y
  27. $win32 = ($WIN == 1) ? "\" : "/";
    # q) h/ k9 `1 w4 _+ g
  28. $folder = dir($sHOME);9 y: N6 H3 O! n- c3 R% S
  29. $foundfolders = array();7 ^# Z3 F5 j7 q
  30. while ($file = $folder->read()) {
    ; a1 r+ d1 I/ C4 }
  31.   if($file != "." and $file != "..") {8 G, k# i: `% ?0 t- ?; Z3 @# _
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    ; [) Q4 {; T. n( v+ [0 |* n  p
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;8 ^+ n) {$ g' s$ i0 s* t0 @
  34.    } else {9 B5 ], N; r- g* P) m# `
  35.     $content = file_get_contents($sHOME . $win32 . $file);* u: [. l9 x, j/ c( ~0 t* Z
  36.     $BOM = SearchBOM($content);5 O/ u2 T0 z1 Z1 P
  37.     if ($BOM) {! Q! d. f# h# C3 |& e7 X* Q4 w
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    4 A% f0 c, r4 w2 Q+ t) Z
  39.      // 移出BOM信息
    $ k  T3 G( K% `: T# Z% Q6 e
  40.      $content = substr($content,3);
    . {; x9 M' U" W) S* D# b
  41.      // 写回到原始文件
    " F8 I, y) j& p
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    5 c/ a; P1 N% R& b
  43.     }
    - S2 q+ g2 ]4 Y* D2 {! m/ ]
  44.    }
    ( F0 v: U" [5 m+ K: M# e
  45.   }
    $ _' u. w% w4 ?2 {
  46. }
    , L$ g( u- W7 x  J0 `8 r0 z6 r4 N
  47. $folder->close();1 M* B6 |% L! P2 w% B/ P; W. R! k
  48. if(count($foundfolders) > 0) {; h7 Z* f8 T# p# J
  49.   foreach ($foundfolders as $folder) {
    * K- S, a/ e6 x4 J( r- E. o  [" {4 l
  50.    RecursiveFolder($folder, $win32);+ s: P# U6 w( T! l/ w9 i( |
  51.   }
    - ^& L$ N" c' ^4 ^& X
  52. }( o% P0 @7 O# h4 z3 e' p1 u* C* N
  53. }
    4 T, g; }3 {" p, i" k
  54. // 搜索当前文件是否有BOM2 z1 W' D; X% q+ m) |& i8 q' g
  55. function SearchBOM($string) { ' p) t! v/ n5 H" g' k
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;3 G$ e% n1 s( ]
  57.   return false; " H+ m+ _* ]* ]' `
  58. }
    . h- J# B8 J8 O# R
  59. ?>$ j1 q& X5 \* O# K1 z4 o: Q
  60. </body>
    4 v& [: u  p6 [- z& ]# o$ l
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!& _- c: R% |: c0 V5 p# T+ o; Q

9 e- l" o! o4 O

本帖子中包含更多资源

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

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.