模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 " ]8 G- A1 F* k5 [4 k" ]1 T% @
8 v5 Y3 I+ Y; b7 }这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
( V8 u9 I! }" ~, d2 h( G$ m) W) O
) I8 J2 a% l* ~8 d它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
: U) {7 A p7 R3 m9 V
; E8 O- A+ V8 s7 P$ M2 |对于一般的文件,这样并不会产生什么麻烦。2 Z6 o* F9 r* N7 s
0 H/ _8 t9 \* M" {: `3 }) w但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。0 e3 P& F( h* E( r
( }5 C; ]7 i$ K- I9 y
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。 L, L6 a2 _# V0 z9 t7 q9 g; K. b5 e
9 k0 `0 V& P4 J4 ~
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!. v% n4 h7 q/ Y& k' D
% e- ?! O' [. S) O/ w* W1 l直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 7 h' n& ]1 W, \ [6 d7 y6 q
! O0 Y* ?) y4 e: L* X" t然而文件比较多,又想偷懒下,使用下列方法来实现。 0 h# R1 [) i0 J
/ G: a. O% L% j( R
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
7 K) L& _5 W) K9 x8 O; s- R& s* g/ v6 @ U% ? W
* ~: Z$ D* ]# G/ M# T' R1 v6 l
- <?php
& \! E: [ T" w( D' Y' x - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)$ ?$ A- M7 b4 l2 r# x
- $HOME = dirname(__FILE__);
5 U' e/ Z. E" i$ z) C" E1 G - // 如果是Windows系统,修改为:$WIN = 1;* I3 z+ \( @# W
- $WIN = 0;
, w. p. }! H! s' N" G - ?>) z$ Q8 D: G2 H0 P8 c
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) |' J8 U2 E! D2 D9 `0 T
- <html xmlns="http://www.w3.org/1999/xhtml">+ q6 X8 _$ L( _/ n
- <head>
! x: N( i# c; |, w/ J - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />% f) U& N: S- x2 G: \3 `
- <title>UTF8 BOM 清除器</title>5 j8 f. Q, X n% @1 {
- <style>1 t( G5 c% {8 q- k) {
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
6 F m7 {0 |; a, T7 N+ L - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
. [" y( g6 d2 H, G+ v. c: D6 L - </style>
. l! q2 J$ c) s3 y6 X) C9 f - </head>
+ D" o4 [' H2 a7 |3 O, C - <body>% K1 Z3 p4 K9 G, |7 Z
- <?php
) D$ m0 G2 J2 T6 D# T4 N - $BOMBED = array();
+ Z& Z+ ^ a, }2 @! @ - RecursiveFolder($HOME);4 s5 r j- L9 v( h1 R" {8 P+ Y; y
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';+ {5 D U* G( G" t- U* B
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }. G; R* Q. k- o; u
- echo '</p>';3 d1 P- c+ B& N' t1 G
- // 递归扫描6 ]) O7 `2 y) `0 ?
- function RecursiveFolder($sHOME) {
% o v! Z5 \ v. ^- p - global $BOMBED, $WIN;
8 M1 ?4 f- T- t5 G4 _- M* g - $win32 = ($WIN == 1) ? "\" : "/";
/ G+ W+ ~9 `# t! b. l - $folder = dir($sHOME);
0 b6 h0 D( v! S8 ]2 f3 B - $foundfolders = array();6 G h3 {3 j+ n7 ?+ Z
- while ($file = $folder->read()) {# l$ P; i2 j. X, |# B, t& i) S6 f
- if($file != "." and $file != "..") {
/ I" c3 x# A0 t. ` - if(filetype($sHOME . $win32 . $file) == "dir"){5 F) N/ _$ w0 V( ]. x$ i1 r: L
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;8 c- }5 ~2 y' g- ^+ O
- } else {+ L( w4 ?$ f6 W# }4 {
- $content = file_get_contents($sHOME . $win32 . $file);
! x4 X1 H/ |3 w; k' j( ^4 J - $BOM = SearchBOM($content);4 Q0 X0 C5 q3 d8 P0 l' Y, L
- if ($BOM) {
/ l u/ v: z/ Y% ^2 D! G - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;( F% y6 F3 Q& y& n, G
- // 移出BOM信息
) S7 h! q4 H% e. s5 X: ?4 Z3 J - $content = substr($content,3);& q" b$ l$ ~! @0 N% V% t: r
- // 写回到原始文件6 T$ \& G3 B( y# }2 b1 H
- file_put_contents($sHOME . $win32 . $file, $content);8 P* r* h7 k. _+ w9 N1 V* n
- }2 w+ l. P0 l( Y: c9 z" [3 Y, F
- }+ o& r: V$ t% d7 X0 ]
- }% x" V2 Z9 l8 _) Q1 `8 O' w4 }
- }$ |( L/ q, ?" h
- $folder->close();8 l. n5 t9 z& t2 \
- if(count($foundfolders) > 0) {
# K% a0 I' O& Q) H( ^3 X - foreach ($foundfolders as $folder) {
; b2 P: d6 R3 Z9 y% G+ @ - RecursiveFolder($folder, $win32);
) v; h5 x/ s0 |8 h; v - }- t C* f+ r! ?% p( d2 D7 F1 I
- }8 Z- C9 B& X$ X, o- }
- }" h, O& l% U6 y
- // 搜索当前文件是否有BOM
3 G: g& \( W, w# ^9 d; I - function SearchBOM($string) { ; K/ V8 W* s( i( h4 y
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
, s; O) k$ H2 v1 b) e. b - return false;
" b5 C$ {! K/ F' {3 b' s: o! r - }
. f# B; ?: Q3 F( @/ F - ?>7 t' M$ M; W+ q2 T: h
- </body>- f9 n6 M7 f" f8 X4 F
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
8 ]% g# ^& e- D8 G" ^- N: _: ?
: L6 B2 E5 B$ ]5 O( c! K; s: U |