模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
# Y7 P* q5 Q" f9 t) c, g5 y7 h/ c% Y: Q0 O; U, z# {2 V
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
5 l2 a: K* B; n5 x" d
$ G* [- E- d3 i1 z5 f" f0 y* A它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。& e U r1 @# h0 N h+ F
7 N0 ^$ p* y8 n6 J
对于一般的文件,这样并不会产生什么麻烦。
7 J2 K- G' J4 r! g) f
1 f A$ E2 k5 F! ~, I但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
+ x/ H8 v( P. J3 Z6 s* i* I5 c4 p
3 x! U. @' `1 S6 l) T* a+ @6 N7 Y根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
# v2 \' G2 M' B9 _" t, N7 u/ p1 ?
/ ^( j6 Z/ K, }: N- q由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
! @3 g; ~3 k& a8 ~
6 @0 o5 u( t& C% X C: x直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
5 ]2 ~, E( s2 r& f6 ^' e: C# D0 M2 K% e2 D$ ?" u/ m/ |
然而文件比较多,又想偷懒下,使用下列方法来实现。
6 ?9 i6 u" Y' ]! Z: P6 ]
( @& j& n6 R! o- E( X将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
. f: q+ N" s5 e- o6 d8 d5 W( M2 U+ E0 L I# J i+ m2 S
% J0 K M' E- ~8 @7 t- <?php . ]1 `; O& q# U& `
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)3 J4 [# g+ {7 h
- $HOME = dirname(__FILE__);( i0 _; ~5 A3 I* H+ e9 b8 ?- c
- // 如果是Windows系统,修改为:$WIN = 1;
/ U4 r. Q1 s3 L* R$ | w, Z - $WIN = 0;. V0 Y: [' A( o7 y0 W8 ~
- ?>
: s i+ w8 [+ V8 n - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">4 ]" n l+ u: n% R( o4 n% }& l* G
- <html xmlns="http://www.w3.org/1999/xhtml">" _5 \& I% i3 J: @7 F- ?6 v3 @
- <head>, W0 w* u, o9 ~2 Z
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' E. l ~0 x, E$ u
- <title>UTF8 BOM 清除器</title>
* d: W8 l) F) s+ A1 w - <style>+ s( L% X" s3 f6 a
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
7 p! k. s! W2 e/ c x1 o8 I: N( T - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
5 @, w1 x8 a! L; |1 y! W m - </style>6 a/ y- i, X# g6 h9 l
- </head>
1 T& M6 Y. k- O; i - <body>
0 H: u, I8 y7 b, R2 h - <?php: G4 ~6 d8 D) M, Y/ ?' \( V
- $BOMBED = array();5 i2 A7 d4 y2 [# j: W
- RecursiveFolder($HOME);, m2 h' }9 ?$ \3 }( g
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';/ V/ C6 ?8 \1 ]$ d8 q
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }# N8 F z. [+ w; G
- echo '</p>';
) N) S7 ~' M" x1 N! z3 D3 K0 v - // 递归扫描7 K# w; t. u' Z9 @0 C
- function RecursiveFolder($sHOME) {' Z/ \/ Q. i, x: w: T& I9 d
- global $BOMBED, $WIN;' u6 U7 Q1 z8 Y6 A8 I
- $win32 = ($WIN == 1) ? "\" : "/";0 V3 Y [2 L. N2 u# F
- $folder = dir($sHOME);
7 w" w6 a ~# ~ - $foundfolders = array();: y- I, X/ l( S# i/ g# [& U* Y+ c- D5 `
- while ($file = $folder->read()) {3 ?. O2 l8 L) h1 n1 K0 _ M
- if($file != "." and $file != "..") {1 c, @! \# A* Y% u% v# b
- if(filetype($sHOME . $win32 . $file) == "dir"){
& s9 ]5 Z6 ]1 ] - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
1 C( W. d- N! D0 Z) H8 Q! q7 ?( i7 p - } else {
3 S6 M/ V1 `0 _ - $content = file_get_contents($sHOME . $win32 . $file);+ y2 `4 V2 v& G1 S% |# w
- $BOM = SearchBOM($content);
& g' g$ X7 {8 m$ Q8 n - if ($BOM) {0 }. ~3 |; ]! @4 O7 ?' n8 q
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
; i; @! J5 \/ t: L4 ]: S# Q - // 移出BOM信息
* d( G1 E# V% E8 m" C! b1 r - $content = substr($content,3);) z$ Y- s9 _. Q# A$ O Y; ^
- // 写回到原始文件
9 ]4 N! ]) `; W$ u g - file_put_contents($sHOME . $win32 . $file, $content);$ Z7 g/ [' G. j7 Y
- }" ]; B" |. ]; v! G
- }
$ i+ b1 r3 [1 L2 V& C/ J7 _ - }
! A# I3 e' y6 { `+ v& p1 n - }
+ x5 V9 i6 s8 T: x - $folder->close();
: ~& }, M7 b S" _ - if(count($foundfolders) > 0) {
' _; u {0 u! r - foreach ($foundfolders as $folder) {9 C" w1 D: V" O- X
- RecursiveFolder($folder, $win32);
8 p1 c3 |+ j3 F, \: ~ - }
# U7 @! {+ N/ J - }( B9 k( c ^3 `* p; d8 {
- }5 X" v* K5 F0 e" e
- // 搜索当前文件是否有BOM
* E, ~: q( }# G8 K' z - function SearchBOM($string) {
1 F+ K2 c+ [# g" O2 Q' q - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
! F. n9 Z$ O# d1 \$ l# [ - return false;
( w, E$ s$ a+ N S# v! D# @ - }+ w6 n: w4 }4 g4 b
- ?>
+ I4 Q7 [8 I. n2 t - </body>
8 H# p! j4 f# R9 l0 p G2 o - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!$ u2 J5 M8 K( J3 I* u
8 g9 ^0 w( t) s |