模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
1 u( j( t: G* x
) b; t- b) V' M: e这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
; E3 N/ h8 h6 I5 y* b1 N" ~, h) i0 ^
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。" Q) k! C( d5 T6 ^# Y
6 m! [' ?, C6 x
对于一般的文件,这样并不会产生什么麻烦。, T8 l: O( T2 c. D/ G1 ~6 e
/ O6 R @+ u" G T$ q. n, `6 l
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
& N/ _( [& y3 g, g, {1 a# l5 W) U; ]6 \" t7 A# C
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。- I1 p) U4 P- n+ V! L$ B( ?0 w: p
I( x: r5 J9 `. \由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
, B ]1 t3 }9 \# r- P8 [" L! v5 d9 y. Y
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 9 \/ S! u- _3 w4 I+ Q+ m9 I. Q
" S4 u0 a: v$ x; K然而文件比较多,又想偷懒下,使用下列方法来实现。 : W8 {' j. J+ E+ O
" K o$ Q& R1 W将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
1 L( O% Y. q5 R! g2 q2 F3 O1 H( h0 i+ k9 m$ I- @
* R$ {" H# ^0 ?$ C8 X. J- <?php
7 h# S, w2 E; G7 I7 V3 {+ \1 Q( w - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件); [( j& l6 T7 R U$ h/ F- B
- $HOME = dirname(__FILE__);" J# C; U2 N; A6 Y* s
- // 如果是Windows系统,修改为:$WIN = 1;+ n4 O) M; E$ t0 |
- $WIN = 0;; m, e$ q" }) }2 o/ s
- ?>. |4 e1 m* X7 S- X! w# \2 m
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 D7 k0 j3 _8 @7 H- A - <html xmlns="http://www.w3.org/1999/xhtml">1 W. R; c3 O9 Q9 D0 Z; \
- <head>, t3 {! ?2 h! }
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, k( E9 M @# ]! @
- <title>UTF8 BOM 清除器</title>
2 Q1 G s( B9 U( A9 J. y) {9 L - <style>
4 W6 z8 k+ L! {+ t4 J/ L - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }- N; J+ o q8 V9 Q# s* `
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
6 O1 t, ^, R' t1 {+ @9 Y* `" i - </style>
, V1 r, X3 \' e/ K8 q - </head>
* N; |* a! R4 {3 z* w* V - <body>
( y9 _+ |, S& d - <?php8 ~4 k- v; l& C& d
- $BOMBED = array();5 E3 B) e1 u5 _: B; j8 d9 V) c" X
- RecursiveFolder($HOME);
$ e$ d- K* [7 X; k: z - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
e) w- b7 E" c2 s* a* D - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; } _ f# Y/ t$ n$ m3 w% _0 f
- echo '</p>';
; B4 z \: e5 } { - // 递归扫描1 l! ?# ]; M& g' V
- function RecursiveFolder($sHOME) {# |& M S$ k" e
- global $BOMBED, $WIN;" N* [- A8 b! n. B
- $win32 = ($WIN == 1) ? "\" : "/";) ^5 N- O* e! c# {' T J: a
- $folder = dir($sHOME);! a1 @ k# @ y" i Y
- $foundfolders = array();
, Y* j3 r$ ?9 b& S* H) y - while ($file = $folder->read()) {
2 \1 m% X$ z) V" T) y4 [ - if($file != "." and $file != "..") {* `9 x. ~+ |; w
- if(filetype($sHOME . $win32 . $file) == "dir"){! h4 M4 Y, k' T% X3 k& H
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
3 `' J: ^" W5 k) z) `' i5 Z/ Y - } else {
h( q6 ?" z* y% S: g3 n7 [ - $content = file_get_contents($sHOME . $win32 . $file);
6 Y9 t8 n6 [2 h' A$ K- q& A - $BOM = SearchBOM($content);: s* y- p0 Q+ a A" F' Y1 ~; w
- if ($BOM) {
+ j; A( r& D6 h4 I& E - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;0 N Q N1 Y: ?4 k
- // 移出BOM信息) L* [! T# i1 H8 n2 q: J
- $content = substr($content,3);: w5 T! U) d0 f5 t" m, Y2 u
- // 写回到原始文件
$ ^* ?. s) Y4 Y7 E& ?4 B+ s - file_put_contents($sHOME . $win32 . $file, $content);# P- v8 d+ A- Z2 q% Y, ^
- }0 P9 _0 v9 H6 a4 f# ~4 X1 T
- }7 M1 v/ v u: d' H' s
- }
: p! J5 ^' M7 ?3 T! `( ^% u; w - }
: g6 I( W: g0 Y0 q - $folder->close();
$ u7 q0 u0 ^7 H - if(count($foundfolders) > 0) {9 F+ l! }& I* c% \; ?6 L& o
- foreach ($foundfolders as $folder) {
B9 W3 [ o3 w, `1 u7 E. n - RecursiveFolder($folder, $win32);
8 n8 X$ R4 V# w - }) j, D. A7 ^; k1 h# k
- }
$ D- U8 Q5 F, K* F1 p) ]7 @ - }
+ p+ w/ U- [, H - // 搜索当前文件是否有BOM: j/ v5 L' Y7 O2 h( \; y
- function SearchBOM($string) { 8 [/ i, ^: a: I2 t) a# u4 g" h
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;7 b" W5 R6 V9 }% h# ]" a3 L' H
- return false; ( a" _) ]7 U4 [2 ^9 j
- }$ n& {5 H1 r4 x2 B7 l
- ?>( S; a5 _# B" F! \$ H! V. L
- </body>
; i y) K: g1 z, _3 J) b1 b - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
+ ^! {! t) i" Y; X6 @ C' I, `
$ w: f" L: R7 k8 n) @% B |