开启左侧

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

  [复制链接]
67726 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
4 l# t" r) W+ `' I/ Q
  q6 X; M5 _8 s# C3 N# |' e" a这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
! O3 q% \0 _7 S/ E: V
" Z6 V! B0 |" n: p, }, g它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
6 r, z' F) H, y. Q. A7 N* Z1 }  y2 e8 M8 c
对于一般的文件,这样并不会产生什么麻烦。4 R  Y* m( d7 Y! i; _0 D0 a+ B
. W6 b6 K0 S& c" R
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。) f$ \: Q/ Z. Q. x

! k) M1 o7 E8 g根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。: K3 o: g, e' }8 O' h
. u' f2 C' A0 A$ W
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
. f) f. Y1 h# b5 S
1 L  e  U2 J4 Z$ }5 l( _1 c1 R直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   5 [- L: {% S: v4 x$ x5 E, g+ w$ a. ]
) i; |6 F: i# }" U9 X% W. n% q
然而文件比较多,又想偷懒下,使用下列方法来实现。  ' `5 T( w) y- d- A$ |

( P1 Q! u( U+ f' [$ u, I/ d将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
% }' X7 S$ p& b; {9 }# a
3 m2 X, q4 M, F6 d2 C: i) U, W8 M6 i0 c/ f4 t& Z% l, p6 u
  1. <?php
    % U. z; {. X. `) ]$ z, a
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    5 ^' H7 z! i* T$ v8 D- g
  3. $HOME = dirname(__FILE__);
    ' I$ i/ o# i! }
  4. // 如果是Windows系统,修改为:$WIN = 1;% X# q* q4 K. l* i
  5. $WIN = 0;
    1 J. g7 I2 {$ H: h4 v9 ^
  6. ?>% G* ?3 Z$ j! h% d, a! U
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' O% H5 m/ s2 [& f+ W7 H" b
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    1 U/ a/ t! p& ^# v
  9. <head>& c" A7 u+ [: ]4 E% u  I
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ) J# i+ W; U6 }2 }, K* M, X
  11. <title>UTF8 BOM 清除器</title>( R9 A- ^8 |$ ?% N: f" P+ \% T
  12. <style>" M& }$ ~( i* Y/ M1 y* o0 P
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }* _# s6 L  C4 T0 @
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }% i( w8 s( z- Q/ |& T1 K
  15. </style>
    " F8 v( I. p3 b# Z) x5 d
  16. </head>  ]+ m8 R/ O3 |! z8 p
  17. <body>
    # j9 K+ a: H  V5 |
  18. <?php- v6 A% f# c1 ^
  19. $BOMBED = array();( K. Q; ~2 m* t! l
  20. RecursiveFolder($HOME);5 h5 a- H  M: _. }& K
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';+ ~+ ], t) T' N2 h# \4 p
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    3 a8 ~: z' g8 h  B$ {5 C
  23. echo '</p>';
    8 n+ E- V- L2 R) G4 M; N
  24. // 递归扫描0 g* y8 g6 B) ?# K. j5 A
  25. function RecursiveFolder($sHOME) {
    1 L8 |0 q9 i5 {3 @4 e% V
  26. global $BOMBED, $WIN;* l* ^! T4 W' c. }6 O8 P
  27. $win32 = ($WIN == 1) ? "\" : "/";! \+ I5 R9 Z6 }' v* W) v
  28. $folder = dir($sHOME);
    " i- x* g- p9 @1 ~  _$ J
  29. $foundfolders = array();
    ! o/ v, m/ E9 @) U3 ~+ r7 P* @5 ~
  30. while ($file = $folder->read()) {
    1 t* k- \- ]- C* k% s
  31.   if($file != "." and $file != "..") {) J" g6 l/ \! k' c
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){! o  _7 D1 K9 C# a0 B% ?1 z
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;. s& y4 m9 I- A/ v8 Y+ |
  34.    } else {' }7 d, h4 Q4 B! S+ V
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    # c; ~( ~- u, f  D
  36.     $BOM = SearchBOM($content);
    # w+ u/ K1 ]  w, ]4 j
  37.     if ($BOM) {) Z8 [/ X$ j' M1 u1 T  p  Y
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    $ ?" }6 @) `5 }6 f; G
  39.      // 移出BOM信息
    5 g; Q& [+ W4 z8 m0 n" G, W: L
  40.      $content = substr($content,3);; F7 y- J6 d5 W! t& j( b
  41.      // 写回到原始文件
    # P" v5 r/ B! n! d
  42.      file_put_contents($sHOME . $win32 . $file, $content);" y% d' b$ n1 v% g
  43.     }
    7 c) O" i& ]% i$ a0 ^( e) N0 ?! H1 K
  44.    }
    8 c8 ?8 W0 U) r5 M% |
  45.   }
    # C+ i1 I& |; h! @9 q2 v) G
  46. }
    1 [, Z3 e4 `' X. ?& x+ r) [% n
  47. $folder->close();
    " s3 t' w1 f( N9 l8 G9 w
  48. if(count($foundfolders) > 0) {8 ?8 [5 Z  _/ B& D  f4 U; r) l
  49.   foreach ($foundfolders as $folder) {
    6 C. W7 K( Z, T2 J# ~! ^
  50.    RecursiveFolder($folder, $win32);
    / t( K  `- T3 P" @
  51.   }* J8 r* t- ]& x. B; S% p+ A
  52. }" C/ s% D9 I$ L2 ?- @/ ^
  53. }
    # E! [" `) H: o+ b
  54. // 搜索当前文件是否有BOM: p* P- r! R4 H3 ]6 n& g2 m
  55. function SearchBOM($string) { 2 [. K' J0 P- F( m# J; x
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    + _5 H3 D7 o& Q& u2 y, p4 E
  57.   return false;
    ' ~4 a" |( j& x5 F! o
  58. }' a$ G, v# {& B& V7 h, Y9 D( h
  59. ?>. [  h- g* h4 J( V: g; q. i
  60. </body>
    / |- T1 ~8 X% v) }& T2 q2 @
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!. X0 S: L3 r5 h7 X
8 a5 f" F4 b& G) g: l, C

本帖子中包含更多资源

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

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.