模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 9 R9 W$ b' t% A
$ [! [5 V; w/ n( d1 s这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
3 b" m- r; P! @
% T7 X" }5 C" ~# x! E; D1 y它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! Z1 t$ n/ l1 t$ x/ h2 @& o4 Q/ s
' J# k6 `& a5 N7 b3 H! ~$ ?对于一般的文件,这样并不会产生什么麻烦。" @* Y: O- P( X+ T3 X
% A$ O" ?% E, x但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
9 g# W/ y. r9 y4 v% q/ s" ~' q/ I
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
7 A# Z) J8 j' Q! K+ T* c; B7 {0 ~9 \& m5 t' l; q
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!! y! ]1 ]7 z% e& f5 n' L# F
& A2 x4 ^1 G/ K; K% |2 I5 k+ p3 f0 i
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ) P+ H0 N0 f7 Q& G, h0 a' |
% s+ _5 R( F9 X+ ~4 p( e& ~& U
然而文件比较多,又想偷懒下,使用下列方法来实现。 - }( t$ a1 z3 s$ _+ q) A* n
# |& ]* ~) D/ H- e; s
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
6 T. C5 T, ?! I0 \6 z4 h
1 K- M6 ]2 a/ M; a- u7 y9 i) k$ V# V6 c% `# k( p4 L. U8 @
- <?php
! W- I) Y! w, q' i" ~9 ` - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件) |% R) \: Q. i0 Z3 d2 J) T, a
- $HOME = dirname(__FILE__);2 |6 M1 ^ v" `1 L5 t
- // 如果是Windows系统,修改为:$WIN = 1;
3 a; P9 x, n# r6 ~& ]1 v, U - $WIN = 0;
, }: x3 K- C* I( y - ?>
7 M o8 `2 f7 ^# g - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
, F: y+ G# Z8 ~, X+ R7 ^ - <html xmlns="http://www.w3.org/1999/xhtml">% u) ]2 |# C0 i* U, p0 v
- <head>
! c) f9 e% x( h- ]3 |9 h- F5 t - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />% R0 u) `5 z6 R$ ]/ R& z: ?
- <title>UTF8 BOM 清除器</title>$ G4 P$ R% @% a4 P% u* s% l% N+ b
- <style>
. x8 i8 u! J8 n4 b! x- u2 p - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }7 M( Z- |% ~( H# D. |9 c' c
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
& V" t% ^7 l: {2 a! Z" v - </style>
% }! ^6 ^1 _+ X+ d* S. B; U. l) d - </head>$ D" q0 [. Q# ~1 @, z
- <body>
4 @* j5 `3 @) `9 k8 { - <?php
$ h8 _( H. H/ Z# p - $BOMBED = array();
/ m, N) k! P1 b, o- v - RecursiveFolder($HOME);
" A; z( q4 j0 Q T9 E* ^5 n - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';, h' R6 a2 n5 |( G
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
# Q1 P; j( f( Z0 E: v - echo '</p>';
) \6 V& \5 t% ]2 M5 {, c: Q - // 递归扫描0 e. u1 k, I3 A+ r) k: |% h
- function RecursiveFolder($sHOME) {
! `6 O8 T2 m* S( f - global $BOMBED, $WIN;
2 D5 y. _( b! a" w% p4 {4 D - $win32 = ($WIN == 1) ? "\" : "/";
( i" k. t4 T- M) Y1 h4 x - $folder = dir($sHOME);5 g D0 Z8 V8 R0 n7 ^
- $foundfolders = array();
2 \: x) A% {. N' M5 _/ L2 |. V: J - while ($file = $folder->read()) {; H' U( \3 R7 ]
- if($file != "." and $file != "..") {
, C) s; {* M4 T7 s - if(filetype($sHOME . $win32 . $file) == "dir"){0 X% n' Z! ^# W' z; ^
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;3 Y2 y) d7 Y# z8 S% |
- } else {
/ z ]* k. B0 y ]1 B% m - $content = file_get_contents($sHOME . $win32 . $file);
! \, a) Z5 F' N; r9 E: J - $BOM = SearchBOM($content);
% Z' Q9 V3 c, R* E" E - if ($BOM) {
8 U) {* v6 l9 d/ T- j - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;# m r( u2 X2 Q: q" K: ?$ H. D" P, |
- // 移出BOM信息6 |" x/ Q+ Z; l8 y6 |6 Y' r
- $content = substr($content,3);6 |! Y8 Z5 s- K( C
- // 写回到原始文件6 U) H' s( @1 L" G& B
- file_put_contents($sHOME . $win32 . $file, $content);7 H+ S' w+ u# r# _$ v) y5 u1 u( J
- }+ X7 @% t* K3 S) S8 n2 X0 ~5 t
- }
$ ~4 g0 k1 N/ s% K( y - }% X2 M ?1 q0 N7 i' k8 H* |/ w
- }" o% k6 N0 w C) i7 {+ O. U
- $folder->close();
0 W) M; s2 H/ H+ V - if(count($foundfolders) > 0) {
+ i! Y0 G1 w7 O1 b$ {. M - foreach ($foundfolders as $folder) {
h& b( z- v+ W) }, S! o1 ?3 J" m - RecursiveFolder($folder, $win32);: ~4 V0 o( m4 C2 D1 r; F
- }. {% D7 x4 _% }1 B- ?
- }2 z' o' P6 D, _9 ]* a
- }
- D4 B2 f% Z% v6 q4 F. Z - // 搜索当前文件是否有BOM
d0 W" n( e5 g( K# g- Q - function SearchBOM($string) {
9 G4 r: m& C2 ?& e - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
9 R5 Q7 n D) L - return false;
/ A& S/ F8 N1 W2 X' p6 Z) B - }" `1 C; n% v5 v1 @2 V% ^6 X+ i; x
- ?>, g# ~, w, N# A i0 f+ G" K, T
- </body>
, w* W& }4 I$ u0 |! E - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
8 ?! S; X" y1 T' I/ l& e% u- F+ C
9 U% g) P# i. o4 |. R |