模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
& N( R, M; D+ n2 y9 s
( ?) R4 }# C* J# v) S* d这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
. T- K: M/ J: `+ a( c/ }+ G6 R$ w% o% p# s5 o$ o# ^; d) h0 L
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。/ i! u6 a+ C: j* _1 k0 Q* S$ a
; j. z- ?+ }% X! }. e0 {1 ^
对于一般的文件,这样并不会产生什么麻烦。2 E3 N) j$ P% z% ~2 ?( z
i4 o* x& x! {# O# q# Q. C- v
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。& E9 g8 }/ v) x5 G, d9 i, o
5 g" ]+ l* x, G4 r0 |
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
7 y3 ^8 b$ P9 @; o. k; H6 C( U
. H \- E, ?! c0 j6 x s3 _由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!4 n2 D5 W. `( H/ U
- ~; \# U8 t" W) {2 T4 i直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ( X; L# c- T4 R
! j' M0 j7 w/ ^+ S
然而文件比较多,又想偷懒下,使用下列方法来实现。
$ p4 c* I4 ?$ A$ o4 G; |' m: m/ F1 ?! I
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换5 d" m n2 i. L& f" @7 M
6 x1 A2 P4 P( m
3 T8 e6 k0 \/ C; c* G6 O/ h" {
- <?php
% I& N0 w2 g3 y9 x! ] - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
! S$ M4 W5 n6 A# | - $HOME = dirname(__FILE__);3 L& \4 H2 [; k5 f9 V0 y
- // 如果是Windows系统,修改为:$WIN = 1;
! V$ A- i. `+ X - $WIN = 0;
& G1 a' u& }# q+ X2 U1 i - ?>! F. e% {; s9 Z$ I; F# ~ B$ S
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">; H% V5 j7 I& m, }
- <html xmlns="http://www.w3.org/1999/xhtml">. z' M S6 @4 p. {8 S
- <head>
3 s8 ]4 e/ K- e, y8 i# M- y( I - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />( M- G/ k8 g9 A) x- t7 G2 S( X% Y7 O
- <title>UTF8 BOM 清除器</title>
; \2 I. a1 [9 ~& M& f3 M6 n3 l - <style>
" Z9 K7 ]) g7 d - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
$ i& I1 U& ^( ^$ [% p9 Q6 i$ { - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }4 f$ k* c4 l/ ?! F
- </style>
) l( g: n5 S! D: D$ b& y/ @ - </head>0 T4 G( n8 p: |0 D1 V2 x( k
- <body>
8 W! W i2 I a( U1 r6 z, O - <?php
9 _: B( a) |3 d% |3 o& a6 r" s. ] - $BOMBED = array();3 }" V7 O) S, C' @& `: A% f
- RecursiveFolder($HOME);
, i( l b8 I9 w+ { - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
- h/ ?7 b! E( ~/ C! M - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
3 |' X7 J* e: O9 X - echo '</p>';
! Y9 q; w9 Z5 N' m7 E0 [ - // 递归扫描
- d+ p c4 M( y7 g2 K - function RecursiveFolder($sHOME) {0 V D" V0 G2 Q/ S
- global $BOMBED, $WIN;
7 I2 o" l* l# n3 c0 I - $win32 = ($WIN == 1) ? "\" : "/";, R3 s- A7 c, e
- $folder = dir($sHOME);
W, e+ U9 ]/ V( G+ g5 H1 f" R4 m - $foundfolders = array();
6 ]( S4 u7 q5 |; M5 c3 Y( t! z4 v& B, d - while ($file = $folder->read()) {
, V: D; B% b1 ]/ \* M( B - if($file != "." and $file != "..") {
: }6 a, k- Q; ]: ^: U1 O; {+ Q i& ]( ^ - if(filetype($sHOME . $win32 . $file) == "dir"){
5 R3 i9 V+ v& h$ B; o( l9 B& i - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
" s* X9 \7 K5 ^7 N9 g9 b - } else {# S2 w/ z" Z9 T) @( e
- $content = file_get_contents($sHOME . $win32 . $file);. S* h- L- {5 k, f; N% W& c8 m
- $BOM = SearchBOM($content);( r5 s I$ m( P! D6 [6 x
- if ($BOM) {
# O$ a' @: q1 s3 A" A5 T# Y2 b - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;7 T1 ^$ Z5 c" Y/ Y. q2 b4 x
- // 移出BOM信息7 w" u# N& {% d0 z7 q g
- $content = substr($content,3);
! e- w; J3 C- ` - // 写回到原始文件 `. Q( p0 @/ P. k5 c! W' q3 u
- file_put_contents($sHOME . $win32 . $file, $content);" g( K+ q* G+ O
- }$ \: q# z7 T' D P
- }
. j& O8 k2 w+ ~$ N7 I. i. U2 v - }
3 u. l7 {) H0 w3 ]6 w s- ?& K# n - }* p3 _: }2 j$ }& _* r, |8 N2 T# h
- $folder->close();3 j% x6 `" v! @7 `4 T1 o% W
- if(count($foundfolders) > 0) {/ v) A* V6 N w
- foreach ($foundfolders as $folder) {% S9 O, H" B C% g
- RecursiveFolder($folder, $win32);
) Y% J& ~" }- ]" Z/ w8 w - }
( ^) L; @: A+ @. G0 p - }
% P1 I3 _9 @% T: M$ z - }$ f& a8 O' Z, x- z, |* J4 Q+ N
- // 搜索当前文件是否有BOM4 q* Y4 ]2 O0 ?: U9 {
- function SearchBOM($string) {
& b0 K- c8 l z! h - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
2 ~9 j& K8 l; Q7 L5 G! c - return false;
# a: ?* a- |7 ~; }* U - } G/ W( g/ V) N& _
- ?>
1 G9 c8 n/ b( _/ [ - </body>
/ m& b" V+ [& Q$ E# m ^, F - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!$ ]( \; y( {" m+ `# Y K4 w2 ^. @
; U1 X( p+ o" F$ @
|