模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
! S5 Z* t3 F( ^2 t; ^/ Q
2 M: q( n) ?2 F: y( |这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
; `7 y* F; D) |
! w1 r( k$ B0 z" y! X它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
" _$ f% Y) G. K1 v m) {
4 z( _4 z/ |- @+ v8 V' E* C对于一般的文件,这样并不会产生什么麻烦。) \. {4 x& {' i$ V
: c D+ o$ c$ G; D$ x8 n但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
5 e5 ]9 v) c5 n/ U- Z% E9 w# S# h. G, D8 i
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。0 K2 f3 c4 p* K( ]% u# F: \; f
$ ~7 @& [! s. Z' \8 u3 D9 V" [) e由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!+ ?) @- e9 b+ Y0 n
" k. Z5 ]4 s9 H* s3 W$ Z9 I8 |直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
# U& s) l( P/ @9 ]' m+ M3 q0 f
+ c# A% \" Q" o; W1 ^然而文件比较多,又想偷懒下,使用下列方法来实现。
0 E$ g: g2 ~4 V* X( s7 |' t: I* t6 d$ c. t& b5 \ W
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换8 G4 _. R0 G6 ~" O2 m& ~7 x
# s* t/ {, y ~$ F4 T2 D
6 q/ O% u1 g. i% }
- <?php
' e" h& k4 M0 ~7 h5 \$ f# I - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
6 J4 J9 G/ \1 a6 f3 w+ b - $HOME = dirname(__FILE__);1 ~: n, l9 T. U& X6 q3 q2 j0 D
- // 如果是Windows系统,修改为:$WIN = 1;
$ l: R2 W1 g0 N1 U" }# ?6 N - $WIN = 0;% S" C1 R1 O; q8 d, R$ S
- ?>
5 S* n7 N r2 c. N& C% |7 y - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- J/ q3 t8 m# a- l - <html xmlns="http://www.w3.org/1999/xhtml">
; h% b% q5 ?7 j: t4 E$ I: ~2 ~ - <head>' q7 t5 |$ o. y! k1 [2 s; |
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4 z0 g, m, a2 \5 q+ C4 n! m9 w - <title>UTF8 BOM 清除器</title>
, I x! q' Z1 J( c% \+ M9 h& D - <style>
$ ?4 k8 E% E- s# J, N. ^. q - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }, {; ?, B" X/ M& _
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
; t3 h1 Z! P" U j7 u; l - </style>2 t7 ]" G0 A: o- Z$ M( W' Q( c
- </head>+ E# C) D: o5 u9 e/ l, \% K
- <body>
/ M, C9 c4 T9 _, ]& \% q - <?php
1 R7 w& ?, z9 o6 w( E& v - $BOMBED = array();+ ]" G$ |1 o+ V" L9 }3 W9 B
- RecursiveFolder($HOME);
7 v3 E" v* q5 w4 @+ C3 q* m - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
- B5 C! \. }/ r+ g. S4 z7 R - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }# C7 D% G3 w2 a2 C4 A, |& t
- echo '</p>';5 c2 N% s% E7 `! e+ y- R0 r
- // 递归扫描
9 b {* h# K/ R6 n - function RecursiveFolder($sHOME) {" }$ T1 T; P) J4 {
- global $BOMBED, $WIN;% G7 r$ c9 t7 P# @! Q+ b
- $win32 = ($WIN == 1) ? "\" : "/";2 A. R" m1 L' m- ? Y( `
- $folder = dir($sHOME);
4 I1 w. Y$ }. c' Q - $foundfolders = array();
3 d$ A. L5 X$ h( y; W - while ($file = $folder->read()) {! m, `% H4 N+ j( h: j% t4 ?6 b
- if($file != "." and $file != "..") {# P( c9 W) {. c8 J, z
- if(filetype($sHOME . $win32 . $file) == "dir"){3 O3 D/ S2 M4 ~; N% n, y0 t' u% k
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
3 B2 M1 z! Y& w6 C - } else {* l) v1 O" |; g& d( I8 Q8 O r
- $content = file_get_contents($sHOME . $win32 . $file);
9 U& G) f, X- E4 D: Z! Q - $BOM = SearchBOM($content);1 y- r5 m1 B8 R4 F W' x
- if ($BOM) {
$ L4 n2 m; x) @, ^5 T2 | - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
$ i; E1 h' g* c1 f - // 移出BOM信息
8 N% V) `* h- N1 C* \* o7 ^ - $content = substr($content,3);4 ^( q9 s0 [2 c" U* |
- // 写回到原始文件
0 C/ m6 E, y8 e" j2 W/ E - file_put_contents($sHOME . $win32 . $file, $content);
2 h: N$ R+ f/ \- I* A - }: N* r2 w. w1 Y, w! H. l
- }) Y# U {" b3 j( e! b- o, b
- }
' F- z* Y6 d2 f( y% s0 A3 H - }
1 }, [9 q6 N3 L2 o6 {/ y+ v' ` - $folder->close();
$ R$ T/ g4 D h" |& l0 P$ G0 { - if(count($foundfolders) > 0) {4 G4 p: ]) k0 Y% q8 h: \( P
- foreach ($foundfolders as $folder) {5 G4 S4 N4 \1 M2 |, B
- RecursiveFolder($folder, $win32);9 [8 L. o, E/ k
- }
7 K6 |; J. ], W% K - }
# M* ?/ a' g. x; ^ - }$ V2 G0 Y# t" n
- // 搜索当前文件是否有BOM' J7 M* M+ v9 l
- function SearchBOM($string) { " m' } w; C' q; @2 ]; G
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;) f- S: ~2 ]# k
- return false;
, r2 y1 q3 N/ N2 l0 A1 U' C" i* V - }
& L- c2 V/ ^- x" l5 C4 }9 F - ?>* w& ~$ r/ O. W9 T5 o" ?
- </body>0 j% C: _' k& Q5 n" B4 t
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!& S1 ?5 t. B" G% K; Q) I, e+ r$ u
" I7 Z" Y, s! l9 w! \& V4 k
|