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