模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 - H* G4 c( w+ j4 B8 `% V$ J& l
* `0 N; e. ~6 P# A! e# p* B这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
2 T' T5 o' }6 l9 s- y6 x% J: \8 k6 \3 _. K% F r; J* P
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。0 d7 Y$ r @, {3 k
# Z5 Z& |1 T+ d对于一般的文件,这样并不会产生什么麻烦。
' G& @' @6 u& L
) A, I4 }$ z7 N+ V# Y% q但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。5 g+ s2 H0 P' s5 S7 ]9 n
3 @' E6 P4 O% n4 k& \
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
) x7 P/ i9 s1 f, V9 ?
! n, u) c0 K8 c5 o1 @( [由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!" f5 Z! T; q4 ]6 S. H2 K5 {
, b4 [) V0 `. J& I2 ?' l6 `
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
% ?5 _& d. k/ l( i) F" ~. T' K( v$ |; x$ a
然而文件比较多,又想偷懒下,使用下列方法来实现。 " }5 u& `7 ]! m' i) Z. V4 Z4 ]- U
8 V) o: C$ q5 i q' l4 f& D
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
$ [! h5 T% v" d, w3 U. q+ m2 q8 Q" z6 D8 E' O
% M. l0 h) H* J8 M1 L- <?php
6 _$ t& d. J5 e3 r7 A- W: `; n - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
5 F8 w B+ S Y" O b - $HOME = dirname(__FILE__);5 u. Q1 @" H5 \; v/ V
- // 如果是Windows系统,修改为:$WIN = 1;: @5 B& }( e9 f! J- T e0 A& L
- $WIN = 0;4 A3 `" H/ n% i J+ f
- ?>
5 _5 I4 @9 u4 d& d- K7 L - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) @2 Y2 I6 ^. Z8 a
- <html xmlns="http://www.w3.org/1999/xhtml">9 I* C) o' |; I4 e6 ]+ I7 i
- <head>* p5 w) f' M' \! b* I5 y
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /># S6 }) m, }8 B1 p( K
- <title>UTF8 BOM 清除器</title>
1 H7 k% ~8 _ G1 B, Y1 a- Q, q - <style>% V \8 f) F& K+ ~- Y3 R
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
# w5 ^4 n5 V6 N$ ^/ {$ I7 f" v$ ] - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
) M8 _( V. O2 t9 c1 z' ] - </style>7 V( _ s6 `: N! t5 g
- </head>: Y0 n9 @3 G/ P0 y0 t! {" R
- <body>
: G" R" `! ~) e9 L- D3 j - <?php2 X. ?" x. U" w; C9 n7 p# t( F
- $BOMBED = array();* c& ]3 y' n- @9 p
- RecursiveFolder($HOME); p6 {% _0 M; C* e* U" I0 b
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';9 ?* Y& Q1 r2 z$ ~3 T* a
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
" i7 L# I7 W# O2 u& x3 w5 i - echo '</p>';
5 D/ N2 c: y8 w% u - // 递归扫描( @0 S5 a; H7 U7 O+ m$ J$ w
- function RecursiveFolder($sHOME) {6 l7 R: ^+ W0 I' @( @
- global $BOMBED, $WIN;
0 y0 y I9 Y J$ n - $win32 = ($WIN == 1) ? "\" : "/";$ [4 B- Y1 ?& D' H- v; ]
- $folder = dir($sHOME);
0 A- E" E5 J; V - $foundfolders = array();. E- l2 L- Q x& `# ~3 F
- while ($file = $folder->read()) {' {; R2 x9 ^ P7 T" C1 E2 H6 }# F
- if($file != "." and $file != "..") {
3 z7 V( [7 C) Q9 R d - if(filetype($sHOME . $win32 . $file) == "dir"){$ N, v( l. S( Y4 Y1 V9 ~$ w" }
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;6 M, C! p) i9 I
- } else {
$ ?4 S' b* N; J8 t - $content = file_get_contents($sHOME . $win32 . $file);/ |5 B( R9 \# I# H+ s5 M
- $BOM = SearchBOM($content);
/ d6 A( g: m8 J7 n) ^: L E( R - if ($BOM) {
( g) `4 x- W1 M3 B, C% j) z: P0 A - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
1 ?: a8 I! A# O& d7 o M - // 移出BOM信息8 [2 Q" G9 ?' E1 K; Q P. d
- $content = substr($content,3);" e( d- r: {7 q8 D4 m3 u, q
- // 写回到原始文件
- S6 \# p; ~- m: A - file_put_contents($sHOME . $win32 . $file, $content);
4 K3 l2 J* `2 _( b5 ~9 G - }. @0 u' V1 Z# a# O
- }% Z/ k* _) t. }* L7 I; v1 J& N- [
- }
+ f8 R, [* t; G7 \& ] - }7 g% R" u$ o, `4 T6 s! n/ i
- $folder->close();. g* A, z( l# P
- if(count($foundfolders) > 0) {
+ n9 @7 k2 A4 O1 H; T6 v - foreach ($foundfolders as $folder) {
/ F& b# P/ ~% \) {5 A% l - RecursiveFolder($folder, $win32);
: ^) p9 G% \, i8 Y* h% r( ~; C - }
$ a. g, j B* \ - }
" y; J- G& d4 u8 L( C( C - }) _" r9 X0 @+ o
- // 搜索当前文件是否有BOM" K/ b N1 A9 B8 q3 E2 Y
- function SearchBOM($string) {
0 X: b% v2 o6 } - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;7 B3 j# q, Y- k( A8 N m7 F6 h
- return false;
" U4 d: h, @; |* w! W' U3 p) i6 ?, G1 I - }
J. j* d3 Z; c: L* ? - ?>
: A: @8 o7 Q( L6 e/ w. B8 M - </body>2 p5 i3 d8 A) n, ^' A, g
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
* C8 p* Q" ~' }2 e8 h0 m( ?
+ R0 v2 q: y2 | m, _+ w4 e# q |