模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 " u3 w' x2 J! X5 R
: i: H/ E, m- j7 Q, b$ F/ a1 q这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
5 ]3 T! _0 D! r& k" \2 G- Q" e- d/ N, Y9 h. E/ Q% M- z+ b
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
3 w/ T/ Z" ^1 N0 b) L7 e& T& @
对于一般的文件,这样并不会产生什么麻烦。
/ y( F/ d) q! n4 ~7 X2 e: S2 p
( T) V) n3 Y% k2 X但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。1 p/ W e) m3 c4 A+ K! j& f
% @$ E3 w4 G8 U2 @ u( a
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
' X3 d- T9 I8 i: [0 _$ J9 t1 m% e7 A+ h& X$ C) {
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!; x8 S) w6 Z+ E- K* U! x
" F1 I! t1 u# A0 P/ b2 C直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
* U+ _; r0 n' c: K! h0 J" M1 Z% q: m; n5 ^+ \
然而文件比较多,又想偷懒下,使用下列方法来实现。 # F _- C/ C6 ~ C6 b& x
7 m1 M+ U4 `2 M将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换2 k: H: O) c3 `, z
& w1 i& T6 q9 Y( ^
) u; x8 d8 }- d) F8 }
- <?php - J: A$ o4 s0 R& q5 S
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
2 M) C" g+ Y1 n7 t - $HOME = dirname(__FILE__);( D/ o7 Y" M4 t8 H$ r% g. }
- // 如果是Windows系统,修改为:$WIN = 1;9 ^9 A. Z' o' c( |/ t
- $WIN = 0;
( h$ A: A7 K. U7 A - ?>
6 I' m5 {, ? l6 {& r) e) H& _: Z - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 J, E& u. h4 ~+ K3 o6 X
- <html xmlns="http://www.w3.org/1999/xhtml">
. j$ i7 I. w7 l) K - <head>2 |. S5 t2 K5 k5 [3 `- g- e% ?
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9 m8 s0 M3 S7 O7 c* V - <title>UTF8 BOM 清除器</title>. B5 a3 y! G3 l6 n. ^+ g
- <style>1 R6 K' n7 S7 o# f( `# E5 y& X! o
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
# T: z+ o+ L4 N @/ z2 Z - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 Y( G$ m0 x0 Q0 i4 t0 U) d0 E
- </style>" Y2 g) k) I4 W X% U h0 W
- </head>3 C# d" T. Y7 p, Y
- <body>
2 g! H# ]/ p+ X0 q4 A" K, x3 E - <?php0 F* R+ n% y p+ c' m& e$ z1 b
- $BOMBED = array();, E. a; V+ l; L) r( w; f$ r
- RecursiveFolder($HOME);/ N3 p, w: U l& G
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';1 h# ~* I% ~, {4 `! G9 B
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }& w' j" t" c# t" p( h1 h
- echo '</p>';
- G3 b/ P3 [2 {6 R - // 递归扫描
/ Z# y/ p* t7 t) w: p8 ` - function RecursiveFolder($sHOME) { a( }( I" Z+ N" v" _# l' [; _& j
- global $BOMBED, $WIN;
0 [/ Z6 z% S$ r: ^1 r- K d - $win32 = ($WIN == 1) ? "\" : "/";0 F9 ]: c+ x+ T3 ~ | Y
- $folder = dir($sHOME); \# I" a! e6 W* d
- $foundfolders = array();. P, U' y L, P
- while ($file = $folder->read()) {1 Q7 H6 B* O% E' |. C" r& u
- if($file != "." and $file != "..") {
. H1 V' A( b( p+ ~/ l0 ? - if(filetype($sHOME . $win32 . $file) == "dir"){
4 l+ b( @6 z& r5 [7 Z7 J4 F - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;) O7 Q' w: C, ~" A* Q2 H# i6 f$ f
- } else {
. [, E# T. m6 Q; ?( E - $content = file_get_contents($sHOME . $win32 . $file);
. F8 |% ^9 m, c7 [/ ]1 X - $BOM = SearchBOM($content);
) R8 t: w5 E$ J! ~' w! \/ q7 x! Y. z# X e - if ($BOM) {( M) v1 k8 C4 H8 ~; w
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;; T& \8 _- A$ Y' {, w% n; b ?
- // 移出BOM信息
, B9 z! d" P) D - $content = substr($content,3);" ^3 ~8 C2 T' M4 u* k$ X
- // 写回到原始文件
3 J$ D- P( f2 x0 P+ p( S s8 J& Y - file_put_contents($sHOME . $win32 . $file, $content);
3 ]+ Q' v5 C0 i* P0 z - }
$ \8 B; z: m; q1 m( b. E - }
1 v8 c7 M4 R" O% f. d* i, ]. A - }
/ K4 K7 D& ~% X0 ~ - }
* F* r X) \7 _! ^" n# y - $folder->close();
4 _$ g2 \& l( A - if(count($foundfolders) > 0) {8 d" I; N' y7 J7 s9 T+ j0 n, Q; i
- foreach ($foundfolders as $folder) {
' x, Z a B$ J6 L5 w5 n" n, i) ?+ n - RecursiveFolder($folder, $win32);, f7 @( B% Z6 E2 C
- }9 b; P! [5 l$ U$ \7 j% B
- }
8 R3 h5 Q* |8 s) f2 V3 ` - }
; @# p/ u/ C' a6 [$ e" W) v& n - // 搜索当前文件是否有BOM9 R1 S6 n/ g' B8 C* r$ `2 W
- function SearchBOM($string) {
4 z3 h, M G8 o( |8 B1 \ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 j1 @) M, q& ~
- return false;
+ T4 M$ y7 k) j - }8 u/ n- z3 Y7 z" {7 b+ q5 S; i* w
- ?>% k [* {* A+ m. ^/ t5 c& P& M- F" k
- </body>5 T7 r5 y, E' ?$ k& ~9 p1 Y
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!$ D' G: F& q- p5 \
3 F) V* ]. t3 H3 b
|