模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 # t, V( X( F+ Z5 A0 Q
4 E8 F/ s9 p5 z& s这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
/ I9 N( Z1 M4 }/ t! k, Y* p4 s
) p+ r" S' ^* e: f它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ ]8 p+ ]1 ]) p5 ~; \: S! h8 M: p5 a6 \9 x6 h
对于一般的文件,这样并不会产生什么麻烦。
# L. F" K" v+ S! y) ?" ^: `& l1 f. \' Q8 p4 P% P
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。& ?2 b" m% I- [
% C2 _; W, s* b) l& c
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。- X7 }. w+ N6 F) z: C; \/ Y: p% W, P5 w
* G: G1 u. k2 u, i由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!) H% x. I8 t: W
5 H; h& p. a7 i4 d7 e直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ( c5 v2 i- Z6 i: U
! a2 g. S* C. ~! Z然而文件比较多,又想偷懒下,使用下列方法来实现。 & m: \ k- @6 ^! M! H/ z5 i
' C& q$ F( A; n将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
5 ~* d( M n+ a% o& F2 p# t# Q7 H, R$ J" P. \
, M8 n/ G' b. I& ]" l: F! Q6 l; l
- <?php
- w1 I! M% A2 q/ e, p. C% x! I/ a - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 F3 q' L" f0 K; K9 Y; c
- $HOME = dirname(__FILE__);. z: H( }, G- Y' n* m, ]
- // 如果是Windows系统,修改为:$WIN = 1;6 P) G+ L$ U4 Y& A, e) ]" }. e
- $WIN = 0;- S+ R0 b l# e: i
- ?>0 B8 S* P+ s' E5 d5 [( p5 @$ }! c7 q
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">& n' ]* @( M. ~* x: g
- <html xmlns="http://www.w3.org/1999/xhtml">
+ q/ I, U0 J1 t$ s5 h, p - <head>) [: r. z: Q1 c8 ]6 N& `8 X
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />8 O- A/ u0 I X3 b& o
- <title>UTF8 BOM 清除器</title>
/ z! x3 F6 e4 H# v& j - <style>
1 {! s6 R- S. T; l0 [ - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }+ |0 o+ x9 k$ ~
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 ^) ?6 v3 o! g) `& Z9 Q2 X
- </style>
& [# c7 s2 d: E& O/ C: L) H( S - </head>3 ]8 z& z+ P- x4 |8 l
- <body>
) A6 H( R) x- G3 ?# X" D& P - <?php+ u# M- E5 G" ~3 T/ I
- $BOMBED = array();
5 y1 i6 e' g0 c; _" `# w - RecursiveFolder($HOME);
* t3 S9 F9 v; J2 p/ S5 k - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';* I6 [- \1 |0 {
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
; n7 I' |3 A7 f( {* |( r/ j6 Z( | - echo '</p>';
% \' E* U& q" v5 [' V) P7 c2 J - // 递归扫描/ k6 h+ f* |7 C c8 @ V
- function RecursiveFolder($sHOME) {
& \" ^. c! V5 b7 m4 X o4 a- | - global $BOMBED, $WIN;' w+ E( l# Q: A- k- x& u2 E$ l3 y- T
- $win32 = ($WIN == 1) ? "\" : "/";
, U! S8 b6 y0 S" s2 N! ] - $folder = dir($sHOME);
7 X! b- e6 R1 D7 Z5 N4 W4 \ - $foundfolders = array();
' Q$ L- m, L! V6 a) _ - while ($file = $folder->read()) {1 M& i# G) {4 Q; q- r) b
- if($file != "." and $file != "..") {% t. a5 B- }. W: g6 B
- if(filetype($sHOME . $win32 . $file) == "dir"){5 t7 M/ O2 r/ Y( }* I( ^, I8 i0 o4 p
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;! G: v$ {! U1 X+ m7 L9 d
- } else {
; @, E! a3 I7 X1 f4 L9 l# b3 j - $content = file_get_contents($sHOME . $win32 . $file);
# C" w, I T2 z% B! y - $BOM = SearchBOM($content);
; F/ {! t( ?" R - if ($BOM) {
$ @. L! }0 V( j( y( A: T7 I- ], | E - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
0 R; \- M/ J0 i7 k! U, ~ \, S - // 移出BOM信息7 e0 l3 S: T" S- `, D; s* \
- $content = substr($content,3);
0 T) {+ ^5 `6 n4 A; S - // 写回到原始文件8 }% C2 I: ]% t
- file_put_contents($sHOME . $win32 . $file, $content);. d% J9 @ ]$ t) {+ C$ J
- }! S# z8 C/ @" v E
- }* {* B& V2 k, B$ f7 p A
- }
# e% M5 X$ [$ K& l2 i1 u @ - }
# u$ ]3 k$ o! j( W6 l0 M2 x$ p - $folder->close();
' ^ f3 |0 [: i: v - if(count($foundfolders) > 0) {/ h; x( g. S; L/ ^- m9 b# s- T. K
- foreach ($foundfolders as $folder) {$ ` w7 ?# b, O9 h* I* u
- RecursiveFolder($folder, $win32);
/ N2 d* G# M- `; f0 | - }9 w$ [& ]0 p& C4 e3 _
- }2 W2 v% @! t2 W; N1 k' [# E L7 o
- }
) E) g% t6 t% f% n& r - // 搜索当前文件是否有BOM: o- s4 s* d9 U1 X! ~5 d
- function SearchBOM($string) {
# J8 E8 K S' y# Z2 r9 _8 p - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
" `! J' \3 N. I; i8 j L - return false; ! T' C+ Z0 F. H7 u7 |
- }5 O. g4 u/ G" g
- ?>
7 d, ]6 L, M6 a3 h - </body>
7 q$ P! r: U5 N% a$ z1 T- ^ - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!" i, V, ]8 I0 T6 H: I
0 }- i4 d0 M- j1 s
|