模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
, G9 D8 a; h4 B3 j$ \* U
9 G, X# V3 I# Z这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
* u8 d, Q+ `& d3 ~/ ?& \( R
) S; G/ R& f$ f1 Z它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
) K( H+ V' G4 x8 Y2 g
0 z- U, f3 l/ O+ u对于一般的文件,这样并不会产生什么麻烦。
( K/ P8 q/ a/ g0 V3 h
; _( z1 I* y) h6 v, P8 B: H但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
3 W# D/ ~& a% ]: s3 F( k- w2 s. y4 j) Y' v
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
9 q3 Q: K+ S% A) M
& ^1 J; S0 U0 M1 f/ ~由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!0 C2 B( ~5 Q8 s5 b
( o3 \* R; p8 a6 B$ k, b# S4 N: m" M直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) + J e& Y4 s- h. W+ a) g8 ]3 k
- v' X6 s$ \. a然而文件比较多,又想偷懒下,使用下列方法来实现。
8 }! q/ G7 n9 n
' H' s+ H) n# s7 [将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换+ ^8 F% A: I( d$ c- |+ ]1 d% ~
0 p: x) r, @& x' _0 h) k3 L" i) M! ^: a8 t3 l, u$ v5 ~- Q
- <?php
* I" w* o. |: a u* F; d - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)$ r1 a R3 \( d8 y* k
- $HOME = dirname(__FILE__);
O9 I$ D, x0 R: K - // 如果是Windows系统,修改为:$WIN = 1;
; ? Y* W& Y7 L2 { - $WIN = 0;$ ^8 U" M1 t3 m H6 A! |& N
- ?>
' @2 l* N1 r2 D- T+ T3 Q* Q - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 R; c# a- H% p+ l8 x& | - <html xmlns="http://www.w3.org/1999/xhtml">, d/ o4 z+ T8 d8 ?# h
- <head>$ F( _9 L# w t# |
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
: y! L0 S1 z& J! F& Y - <title>UTF8 BOM 清除器</title>
& j# e+ |, w. S# X* l6 ` - <style>
7 i9 y' P/ g& Z$ }: s; e+ } - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }/ P; j8 I/ M# V( @9 A/ P
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
: J2 X4 x( s& P7 Q$ b - </style>) P. C% S/ ^. L& N
- </head>9 {9 e3 w& i% D
- <body>5 @+ d. p: X' ~( b
- <?php
- j6 X& Y2 X. E) Z: n; W" \ - $BOMBED = array();
3 j% F$ M- O5 D8 O3 J4 u - RecursiveFolder($HOME);6 p, ~( g& P4 o K6 D5 \& D
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
7 `. w7 J0 ?/ Q, S0 k! s' p# z - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
) C& e$ u5 F) \0 h. r, i - echo '</p>';
1 I0 f6 J/ d" \) g+ v6 H - // 递归扫描
) c- C7 s3 k# d$ O2 L0 N% j9 @ - function RecursiveFolder($sHOME) {
- ^5 X* n1 w& d5 U( H+ P* Y) [, A - global $BOMBED, $WIN;5 L6 |' H+ x& v8 u5 i
- $win32 = ($WIN == 1) ? "\" : "/";
) N9 E( i c$ @ - $folder = dir($sHOME);+ J$ U! W. e$ i. b; q7 B
- $foundfolders = array();: Y' U3 _8 h8 n) ~
- while ($file = $folder->read()) {
; m. m E. s A/ e5 M - if($file != "." and $file != "..") {& _# O4 H) N1 j
- if(filetype($sHOME . $win32 . $file) == "dir"){ c" \ f2 O2 j) v0 Y
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;2 M0 E: H* Q7 L% J7 @, }) k/ Y5 X7 u
- } else {% R7 v9 S! @& e
- $content = file_get_contents($sHOME . $win32 . $file);
& q- y" d7 [5 A- d' M4 v - $BOM = SearchBOM($content);
; O. _# i. @/ _, s! s3 { - if ($BOM) {+ Q+ S+ g' G9 ]5 E
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;, g' j! _& E) B4 p
- // 移出BOM信息" l2 B$ }) _4 a; T$ u% z2 C
- $content = substr($content,3);" W- X- p: ^7 m7 }- H5 _9 o% t
- // 写回到原始文件
5 k+ @' U. H: V P" _* r" ] - file_put_contents($sHOME . $win32 . $file, $content);
0 G$ X# Z# y+ z# l, x( h: f% ^ - }
# L/ t3 F$ [3 n1 C/ Q$ Q) |( { - }
) t: }: l" l" h$ ~* ?2 X7 i - }
% }) W/ I3 s1 y; p. Y/ a - }
+ O- ]# ?* i; S! { - $folder->close();
, m; m% A& ]! L3 R8 @! J2 X& ] - if(count($foundfolders) > 0) {3 ]5 ~" Y: _: H. q
- foreach ($foundfolders as $folder) {5 e1 W b; u9 Q9 U* g$ f8 M; Z- L# X
- RecursiveFolder($folder, $win32);! a5 X: b9 b, y6 \* o% ?
- }
2 B2 e/ u5 W, n, V! K" s - }. m6 ^ W! g7 R2 Q: d/ v R# ?. L
- }, }( f2 r; C5 G' W! U& c! [
- // 搜索当前文件是否有BOM
# e% p3 ^, ]$ m$ T# T U5 { - function SearchBOM($string) { 2 k' m, _; t- `1 f- `
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;5 z U! E+ A0 k; ^1 C# M' r& {2 ~
- return false; ) U% f; y1 x8 c9 I3 I: u) _
- }
+ o' P) O- ~; W, u: h - ?>
+ n* S0 z" ^) X) V - </body>
2 ~ t: p7 K4 J - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!& i/ {3 _2 f+ F; J" U# A
* M3 t7 B+ J3 h# h: G
|