模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 ; i( P8 E, y0 }2 u) V5 f/ \0 L
# t u ]0 g+ R, Q
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
' n7 X2 U- I* U6 G
2 Y) v( e3 C7 u+ J0 ?8 W它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
8 c% g& r* X5 V% v* ^2 U- F% w3 F' x: _) R7 F! |
对于一般的文件,这样并不会产生什么麻烦。
! x+ C4 `0 r& f( n1 x, i- h4 W0 T+ X2 M6 ]8 H* j( ~
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
' q: }# M; H2 E( l1 K2 {2 U4 w, d3 Q. L) h0 J1 u: V5 i) W
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
7 N6 _; c! Q5 ~2 m) \# D( E( Q
1 N8 @# y* a! r" z& m由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!. C# e4 i3 Z4 m* `
& e( {( j; D0 V" \- G5 c直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
1 }$ A# U% S9 \/ p, L
3 |9 z, |0 k& Q然而文件比较多,又想偷懒下,使用下列方法来实现。
4 O( ?, d' X+ d1 q9 G' [2 Q0 ]( L! f7 F9 `( r4 F( N5 y7 H7 H
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# M6 @9 r" J2 [
# ~7 F Y3 x" \) k
7 p* z2 T- b! p0 n' x- <?php 0 ~- U R6 k7 C
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
5 Z; c* d7 x7 |; n8 n- U5 K, J5 K0 w - $HOME = dirname(__FILE__);6 V) k7 X. k+ w# R9 t" H3 O
- // 如果是Windows系统,修改为:$WIN = 1;
2 I6 Z, @ d) `0 t - $WIN = 0;
+ S1 q: J# _( Y" b, F5 H- j4 x - ?>
j: P4 c7 Q5 `+ k' ~5 n - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">0 U2 K4 F. `/ a" a9 i. W! a& J( Y2 w
- <html xmlns="http://www.w3.org/1999/xhtml">6 k6 a- b1 |* |+ X3 m$ C8 x- ]
- <head>
5 ?4 j# v, E' w7 N - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
' P6 X7 u* L3 t3 o5 v, Y - <title>UTF8 BOM 清除器</title>( e5 l' X1 d/ M( v+ y
- <style> M8 F2 Q* i* X; F
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
2 i! C" m8 }. a6 [/ j9 e$ n - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }# z" n& C6 U3 D: N9 j
- </style>0 L, s9 m! j; K9 w/ ^
- </head>" Y8 n) g2 P Y$ [( u# j# ?
- <body>- ]- h. ~2 }. h, @3 L, k
- <?php
6 I0 d! \# I" p; b# C: ]& ^1 c - $BOMBED = array();
, n- [! v) N% z$ w0 Z - RecursiveFolder($HOME);
- N# L: d9 s& A' s& ] - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';0 q! [2 C/ p& i
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }$ v, d5 V* ]7 U+ R6 Z) i
- echo '</p>';
, Z7 m# [. i" e5 E+ G* [$ c - // 递归扫描; t- a0 d8 N3 W; ]) R% P
- function RecursiveFolder($sHOME) {! Y7 @+ f" Q, O- Y
- global $BOMBED, $WIN; S" V, C- |8 u6 U/ Q
- $win32 = ($WIN == 1) ? "\" : "/";
, V9 o) J& F& V! l - $folder = dir($sHOME);3 v$ Z+ }1 x" ]% H- Q& I$ ^
- $foundfolders = array();. X2 n' w) Z( }' X" R* |
- while ($file = $folder->read()) {& E( X6 N8 }. J9 [
- if($file != "." and $file != "..") {
6 U) A5 ~7 [, _7 n- | - if(filetype($sHOME . $win32 . $file) == "dir"){6 P4 E* u+ L; y# R, L* G
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
6 x2 R9 G1 R I$ A' X* S - } else {
) D- p3 @! t, r7 \1 a) y' G - $content = file_get_contents($sHOME . $win32 . $file);
9 }& ] j$ _5 A6 N+ C - $BOM = SearchBOM($content);
* C$ v& A3 z, Z$ x - if ($BOM) {
/ n$ ~- H/ X5 p: L3 |. G3 k - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;. a$ {. q' Y$ E% _" w4 R" } @/ N8 c
- // 移出BOM信息
1 R; _6 I H" j. x - $content = substr($content,3);5 W; H- ~# x- d5 m" g
- // 写回到原始文件( b5 M( C% X }
- file_put_contents($sHOME . $win32 . $file, $content);
* f+ C0 Q: `- g. `. p* E. ~ - }
4 X: r0 b" z) J1 l1 Z' @5 s" B - }: X' H/ R- Y H0 {2 Z ?
- }
d1 M% C: a; t - }
; _- W* ~5 r6 v( ^2 N4 A, M - $folder->close();
% P e7 g2 e( } - if(count($foundfolders) > 0) {: l8 [1 t$ [. X% n
- foreach ($foundfolders as $folder) {% A `: z+ t6 ^ W9 r+ z
- RecursiveFolder($folder, $win32);$ v, } u+ {; ?2 y: k: P
- }1 M+ r' E6 N- O; G3 {/ f3 m) \
- }
2 {) }4 ?& f1 m/ E - }3 E8 n! O' l) N; Y
- // 搜索当前文件是否有BOM
* p: I w$ j) P - function SearchBOM($string) {
6 I! f' x5 ^+ h6 f3 j5 |8 v! w - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;+ q& ~% i9 i- Q; U! O5 _
- return false;
1 W( i- G4 a$ D; P - }
. }2 f& g0 ?( \! Q6 E0 _ - ?>
* s( D' ^: _; s, c - </body>
) q8 A# S5 P R - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!/ P* i3 z1 n! k4 ~9 d
5 N0 _% |: P! V |