模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
7 a/ ~( s, @8 U0 H9 R+ u" Q2 W% Q* r( w
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
8 d0 H) v, |$ A- t1 ]* o7 D$ x' d N7 b. n
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
8 |& u3 T$ \; G3 p8 \3 n
6 y+ a* [/ n$ q5 y4 {+ J1 r对于一般的文件,这样并不会产生什么麻烦。2 `# r/ ~5 n' E7 y
) G% C& d: ^5 H$ Z; P; e但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
% S6 K- W: n7 \ J) N
& l; z4 e7 H3 u8 w7 K2 w C根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
% j' o# U! H* J! U' q, b1 M6 O
- A) o* s8 L; n* p! u由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!7 K8 n, K: p9 G9 o9 O
9 k- E- W4 M2 C3 O2 V9 t% q6 {8 [
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ) T) p* E4 p% w2 _
6 c, n7 O, B) `/ `4 ~
然而文件比较多,又想偷懒下,使用下列方法来实现。 ; u/ N, ~3 @/ n
4 ^& w$ I' f5 }
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换; D6 h$ S( ?2 C# Q, J8 K
- _0 }0 h# H- G% |, o" }8 Q7 _. ^+ M
4 R) T5 {/ m4 |, r- <?php
0 @% `1 p& A2 `! N0 H/ P - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
4 P, U( a$ r4 p4 F7 w - $HOME = dirname(__FILE__);
' m# H% M, W1 q* s" w$ U9 ^+ ?9 d2 {# S - // 如果是Windows系统,修改为:$WIN = 1;
7 [" L% M9 [- R/ @ - $WIN = 0;
- w$ i; ^. K$ T! v I; S( M - ?>
' h8 s! o, n, s) a3 L1 ]) D# V" U1 \ - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">* V1 x8 L) e- O/ Q6 c; Z
- <html xmlns="http://www.w3.org/1999/xhtml">
) \1 q2 S8 f; c/ ^$ d% g, H) C2 d - <head>( k+ Y% V% N/ ?
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 z6 O8 t& }3 G V - <title>UTF8 BOM 清除器</title>0 U8 w& Q4 `3 J, a- U, w3 Q/ j
- <style>
- e$ g# r/ [# C9 O! i0 |0 D - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }" X& b8 t8 f8 i! i6 K
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }! c; _7 q4 C5 k* f
- </style>
0 M( y) W. C: |+ k( I - </head>6 c4 r C. I, n& ]2 H! a# r5 y" [
- <body>
! f F9 m) i: {. J - <?php
- Z9 p: P- c6 C* d6 }; V* K - $BOMBED = array();( F8 t, K4 h+ M$ U# D
- RecursiveFolder($HOME);
# G& a! \5 s- d: S" _) O* a' C. H2 ^ - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
- M) j" r7 |0 `" X) C6 m# R - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
4 q( e9 n1 `5 Y - echo '</p>';7 F1 }' w: A! w
- // 递归扫描$ O5 q/ h* v1 @2 n
- function RecursiveFolder($sHOME) {
6 m: g% J+ [# b a3 n* R+ E! L - global $BOMBED, $WIN;$ R( q/ y* N, ^# [' }+ Z0 a) S
- $win32 = ($WIN == 1) ? "\" : "/";+ d5 d( u. D2 O
- $folder = dir($sHOME);
* s& G9 w# i8 z - $foundfolders = array();5 j& d; u& A/ a
- while ($file = $folder->read()) { W/ g2 n' n% ]; Q _! b
- if($file != "." and $file != "..") {
, s0 d3 J: I. u7 K, n/ e4 ^$ z - if(filetype($sHOME . $win32 . $file) == "dir"){0 e3 A, U5 w( Z& B: N, i& q" G
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;6 h. v6 z+ |; f$ t3 p) \! w
- } else {6 o& z: `* e% H; Z) u3 p2 ]
- $content = file_get_contents($sHOME . $win32 . $file);; c: p3 p6 d4 D0 N
- $BOM = SearchBOM($content);
, h8 M" Y `$ H. ^% Q - if ($BOM) {
9 d. b# f2 R) b - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;( b% }5 M- S2 D
- // 移出BOM信息
: P: ?) {+ w/ U9 e6 g1 e - $content = substr($content,3);
/ x' f' F! f$ o' b - // 写回到原始文件
. d- t% z+ y5 d) U: X1 s - file_put_contents($sHOME . $win32 . $file, $content);
& s9 |! j* m; P c3 O - }3 ] [# Y; T. W$ ^9 M- J
- }
5 f; A7 r3 F0 q5 x - }
$ N5 k7 _/ k7 d% T$ ^( b- G& K - }
" `' {* _* K | n: s7 | - $folder->close();
) V7 B6 N4 H7 I; } - if(count($foundfolders) > 0) {9 K i/ n; B$ U. b
- foreach ($foundfolders as $folder) {; h; [9 N- _, V( p3 p* \* s. \
- RecursiveFolder($folder, $win32);
. _1 c& w0 B- q - }: X& N4 y- z3 M
- }+ J4 N- Z& n( y4 t: A# ]# G* \
- }
- X, a. H2 N4 M$ t - // 搜索当前文件是否有BOM
0 u" `7 E y0 Y& n - function SearchBOM($string) {
+ _& o. T& M5 G P/ V! K4 } - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;3 T7 u) h: b" N. L7 t& _% k
- return false;
* `3 d" {2 d0 i' Y% T8 |3 \ - }
' G- {6 D2 a g0 C' ?4 {2 l - ?>) b+ a# [4 g/ C; ~
- </body>$ B% ~& E5 C8 |1 u7 [8 [
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
0 @) A! X* Z5 h
; H- b+ j; H2 h! A; A% y1 [ |