模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 9 {& e% Z: I; i! o2 y4 {$ J3 j+ W, l
9 U# y8 r: E2 p9 i" @& _这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。7 @! x. N, f k) A. |
7 S& _4 A+ ~: j s6 q它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。; \# F5 I9 N: U/ U
8 O2 R1 G# `8 H7 M
对于一般的文件,这样并不会产生什么麻烦。( i# ^" z9 N" Q# z$ `/ ~- E( h
& Y o/ U1 S( @ }5 P但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
5 F: q+ i% s$ b' m* `" ^& M8 b2 z
% a- Q) @) Z1 o5 L3 N, S根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
' `# s7 W+ W0 V) [% g# f4 S5 i6 W# B$ S2 T1 W+ S
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!$ b) `8 \/ t6 u. {; \, l
. \9 I- J, D" W: o9 x: z/ B直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) " ]" B/ R: i% g: s
U( y4 y* g- d1 I) L9 T3 x4 I8 p
然而文件比较多,又想偷懒下,使用下列方法来实现。
* q+ I) J; n$ ?& W" C
& n: |* ~2 i- I8 Q8 S6 L4 z将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
: T) g% T/ ?( ^0 u( E! O/ d4 u/ [, o! f! b
/ V( n; M" N- R8 f
- <?php
* M6 k. J Q9 U+ t8 v) R$ l - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
$ ^' u: y+ G+ |- Q9 t! r - $HOME = dirname(__FILE__);1 M5 U, V1 X: |- {& s
- // 如果是Windows系统,修改为:$WIN = 1;' u# I B" E" ~) o" Z- j
- $WIN = 0;# \: K& d& A4 E4 L* Z& I% K
- ?>
/ r+ n' f* m t2 U - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4 W& x/ t7 b6 q9 o. I* p* l - <html xmlns="http://www.w3.org/1999/xhtml">6 \% a% H& X9 m& `+ [
- <head>
8 J7 i( F% C9 f. j& @: Z - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8 f* a# L' E! ] ]; T) s" k - <title>UTF8 BOM 清除器</title>
2 t0 ~' G+ L* f1 }7 l. [2 s& } - <style>/ o. F5 L R' I5 j$ j+ m0 i
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
8 v8 D( Z o; |6 ` - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }$ W: A& z, O0 w2 r: T& P+ {
- </style>
1 f$ i _) S9 p* m- m0 t1 N - </head>
3 o" `# Q! L( ^# z: y - <body>
9 |0 _+ ?% H2 {# h8 Y; ~ - <?php/ x0 W0 r& Z! O/ Q" x& @+ W
- $BOMBED = array();- k" ]5 m, L+ g
- RecursiveFolder($HOME);
, \3 l7 t1 K2 h* a) V1 Z/ x - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
& r+ s* j. r7 q+ b6 ` - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }, N( `3 i5 @7 a2 d1 q7 h
- echo '</p>';
+ O m; A* N# L( A1 J - // 递归扫描, ~6 d, v6 |. U& \0 Q9 H
- function RecursiveFolder($sHOME) {
; E9 h* Z3 i8 } - global $BOMBED, $WIN;
. |6 U( x# M5 u- P+ A - $win32 = ($WIN == 1) ? "\" : "/";7 a+ _' e& |+ C( w$ F5 `! H
- $folder = dir($sHOME);
1 e6 v9 P. j, D! Z/ B& A4 j( u( Z7 W8 T - $foundfolders = array();! m d0 h _3 _+ \% b
- while ($file = $folder->read()) {
$ z" W6 M4 I8 K u - if($file != "." and $file != "..") {
: y/ y6 o8 O- O- S: V- u! ] - if(filetype($sHOME . $win32 . $file) == "dir"){1 w/ w6 p' F( k5 D1 @0 p+ \" w
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
8 ~* N0 ~9 B! R" P' h/ I - } else {
1 |7 G- u+ ?# r" U7 D8 } - $content = file_get_contents($sHOME . $win32 . $file);4 L1 L2 f: d3 l3 P
- $BOM = SearchBOM($content);
$ r# k& {0 e& X8 T4 y5 \8 p4 U" H - if ($BOM) {( f3 ?0 u Y9 ^: c/ T8 O7 M6 s! b( X
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
, E+ J3 A4 v0 f E3 ~* s6 F H/ @ - // 移出BOM信息7 m, U3 i( H) \) d$ M
- $content = substr($content,3);
, E; O, m# ~1 }' V - // 写回到原始文件
3 J; S5 w" m4 z: r$ l - file_put_contents($sHOME . $win32 . $file, $content);
+ p" D& w0 `( m' h& f - }1 M+ A( [8 v+ X: `
- }
# C8 S+ F y+ V+ k6 r - }
" R6 u- S. f$ T' q' G - }
, ^; b4 _" B9 [! b$ R4 ^7 E$ o - $folder->close();
$ c) `$ Z3 F, ` - if(count($foundfolders) > 0) {- F7 d& ]9 u0 [& ^) ]1 n6 A% l1 U
- foreach ($foundfolders as $folder) {
, ^$ c& _4 a( l6 s3 O+ {- F - RecursiveFolder($folder, $win32);
( k9 R7 ?) g3 h! L) I - }
' M0 T' F2 m5 @9 ^8 A( O; p. E I - }
; ]$ I) N1 d5 @ - }
, V' W: A* y% ]& x) D - // 搜索当前文件是否有BOM
0 e+ J0 d) I1 W7 T9 S, n: I - function SearchBOM($string) {
P x, p O8 J' D( W( e/ e - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
+ `5 C" a& [9 m8 I. b% u! p- S/ R - return false; 9 r5 p# U2 @8 O& N% n4 z# j
- }
) G: ~5 f: r5 Z) s$ |+ K6 K - ?># l2 P# }7 n- k6 W" \& p, r% U8 o
- </body>
1 `9 |. Q" ?7 f9 A - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!% E& `" B# O9 N
) u$ s2 ?+ z. \ |