模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 " }3 ^6 l" Q0 X c( R M ^: F( T3 X$ [
9 K: t% O3 [2 @+ G$ N: p7 Z
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。# e( z1 K/ D) m# S. G, K3 L) w' j
1 L; D% l+ I( Z9 R) Z% C它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! b- H9 y5 ^3 v/ G" q& L; q6 l
s# C# o$ K6 i1 ^: \
对于一般的文件,这样并不会产生什么麻烦。
! c/ H7 j2 t5 U6 ?/ ^& B& M7 `2 F# _( p5 Q$ Q" s& g" Z
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
, Z# @1 X* [2 f( n. Y0 Y' o% M- B* {$ L: s
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
o% H1 ?" ?5 k& }* t# c' x8 S; r h7 t" t0 [2 I; i; D: m; K# P' f5 T' X1 n
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!: Z- W! H! d X1 h( t
1 ^+ [% Q5 \+ a& g
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 4 ?* ~1 O+ H5 \4 o
9 L$ X! [! K$ p3 ]% _( A然而文件比较多,又想偷懒下,使用下列方法来实现。
M/ R1 m. _6 C( T
4 V |9 t. k' m) N& [将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换6 ~9 [7 I% i. V$ [7 k, ^' U& H. p
7 A% t9 U4 I' u |+ S$ H5 {2 K% V! m: N( w, E/ h" ^: t4 S
- <?php
4 _7 d/ I* \* ~8 u% q9 c - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
6 I! v& i7 @9 h, l5 B# v' g4 e - $HOME = dirname(__FILE__);
4 I3 S: x/ b( v - // 如果是Windows系统,修改为:$WIN = 1;
1 w$ R: R" Q; o# V6 U/ c s - $WIN = 0;: c7 N& ^% G( W: q
- ?>+ f( c; F; O+ `- v( p# p$ h) e
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">* Q, f3 B" v; S% l
- <html xmlns="http://www.w3.org/1999/xhtml">
5 _9 M2 X* h+ A$ t$ {. q, e" A - <head>- T! N) m8 ~) i1 @
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2 p: K( R7 y/ O/ z - <title>UTF8 BOM 清除器</title>
% K" }" t1 l1 O6 }: w. c1 q - <style>
N9 P- Y! ]. k- d - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }1 v+ G4 x# X. W) \$ f
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }* Q- h% ] G0 F; w4 A. R( x
- </style>' h5 \: ~9 F: B9 u" y
- </head>
K4 G3 U# l5 N' c% Z H! P( {! J0 U - <body>
2 h4 F7 B5 [* y" O) u% s - <?php
. m* g6 a* X9 z, Q$ u5 h; L& `5 t - $BOMBED = array();* r' q9 v- l, n5 _# K
- RecursiveFolder($HOME);
: [5 G& c2 Q% N( k* W( {7 Q7 \ - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';" m4 ^) k* H1 a
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }4 t7 H$ S. m0 N+ g" m
- echo '</p>';
1 q# l: L/ J& R* p - // 递归扫描
6 S- t. N: A7 j( x: s g - function RecursiveFolder($sHOME) {
' |8 R" z/ q+ G+ T1 T0 j" s - global $BOMBED, $WIN; p9 E1 v |1 _6 e
- $win32 = ($WIN == 1) ? "\" : "/";
& w$ ?- R7 x: j6 u0 d+ l - $folder = dir($sHOME);
H$ \* ]0 f! r) t - $foundfolders = array();
- s+ y+ |9 ]; K! d1 P. R [ - while ($file = $folder->read()) {
8 n+ l# ^5 u Z$ Z3 s; U* u - if($file != "." and $file != "..") {
1 M$ v$ X/ I: P5 @4 J - if(filetype($sHOME . $win32 . $file) == "dir"){2 X2 k( D/ `/ H
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;) O8 _# F- g( h1 I
- } else {
' j7 d5 \7 t' `4 c, a7 y - $content = file_get_contents($sHOME . $win32 . $file);3 n1 f6 U7 H0 c
- $BOM = SearchBOM($content);7 g, Q% a. l' P6 @; D% i6 n
- if ($BOM) {4 y! `7 I6 ]6 E6 x b9 l# [
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;, I$ M9 Y6 }0 z) }9 u6 \9 h+ D3 l8 c
- // 移出BOM信息
: [2 c' R( C: B" X. u) p - $content = substr($content,3);
9 j( M* g) `$ @. Q! j; a - // 写回到原始文件( l, {/ |' y' ]9 a
- file_put_contents($sHOME . $win32 . $file, $content);5 t7 Q, j0 C: ~
- }! `, P; F* B6 x5 b, D
- }8 z# c! z; u5 {( c$ B9 Y* C; M1 Z
- }; V# u- w5 W" g) m! b, f ?
- }' g3 u4 w7 @6 @
- $folder->close();6 F- v1 ]+ c d) [
- if(count($foundfolders) > 0) {! D0 x4 p5 H/ V0 D5 \2 x: s2 I
- foreach ($foundfolders as $folder) {
% g8 }# k2 F+ d - RecursiveFolder($folder, $win32);! ?1 b6 D$ ~# F* |5 E
- }
* d, h8 _2 g5 l1 q2 N - }+ f0 b7 ^: ~, k& `: T' z, Y/ _
- }+ ]/ _: @; W* U% w) s/ W/ Z5 A
- // 搜索当前文件是否有BOM
' T) F$ ~$ m) H5 M0 e }* r+ H7 L - function SearchBOM($string) { . l2 t3 X0 ]. g; ^, L
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;. K! B6 p" x, r9 n5 k6 ~, \' t' p
- return false;
: V- @6 F1 l) S+ n* u - }4 {( q* y$ m0 N1 z
- ?>: `8 C; b# J& q
- </body>
/ W+ X/ U6 l' l4 |# u$ w+ u - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 @$ _3 ?& Z8 R! S
; ? K) A' s6 z. }& L, M0 _
|