模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 ! r; d0 x9 W5 f4 E9 c& J) [
. c |7 C/ k, C% _) ]这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。" x9 e9 {8 t: a7 e1 E! t
L! h \+ o3 [+ U它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。; D* M' H- s3 \4 B
, r# n$ g/ V( M, S. h8 h
对于一般的文件,这样并不会产生什么麻烦。
5 B; Z m' k; ?) ~% ?' l6 m4 c& w/ H! ~$ Q- W& m o' b9 y% y) i z7 Y7 u1 G5 L
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
9 \* J/ | M! ]9 c3 O/ ]7 {( `- R# U) j
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
! s6 \) B+ j: e) R4 X: D! t9 @: H4 z' @1 p. |& G
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
8 R7 P; w$ e- @# Z
; [% s! N& s0 } |8 ?& k直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 9 F$ k H% d2 w4 M2 A: w
4 h5 ^% E5 E; D/ Q% v
然而文件比较多,又想偷懒下,使用下列方法来实现。 5 ~0 |2 X# K# D5 c
9 N- E4 v9 m$ _, F; a将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
7 _; j% a4 x' t$ p4 q% O4 d
) a6 a1 ?! z" r, e+ K& C7 A: s, C1 q- ? E. R$ v, _7 V
- <?php
4 a$ l/ ^7 v9 O a, J e - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
' `* ]6 y1 A: K* H( p. d) \ - $HOME = dirname(__FILE__);
2 C& {$ l- F* `& L# N- M' B0 O - // 如果是Windows系统,修改为:$WIN = 1;
/ J/ S5 x2 x8 O1 l - $WIN = 0;
9 ]" w! ^! L& I9 _$ F - ?>, D+ ^8 x3 [3 ?7 T3 i& o
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
/ d* I& W6 _. I Q - <html xmlns="http://www.w3.org/1999/xhtml">; w; M7 Y4 @$ t1 Y6 u2 d
- <head>
$ M1 l }. e8 A+ F" Q3 |) G% H - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' d* n- k ?' W% @- h4 W
- <title>UTF8 BOM 清除器</title>
0 f) t1 X1 f7 [ - <style>3 k7 N0 e# w5 S
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
! }( t5 r6 b. {9 ^7 D0 D. [$ Z& v - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }- i1 _" z7 H" m$ X1 q
- </style>
0 V( I) B; L$ p3 T- C$ ~3 K. p - </head>: C* Y" O( k, A" `+ c; h
- <body>, s- ]. K. p! `+ @ K9 `+ r- S2 p
- <?php
( y9 S0 Y! [1 V9 }/ i6 j1 O' h% N# H# X - $BOMBED = array();
7 Q4 J; \3 H+ R3 F, ~ - RecursiveFolder($HOME);$ ?1 b3 \9 {0 @/ j ~! ^( e, W' M G
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';+ V- X/ |, ^. P4 M
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 K6 A3 N0 f4 g; \# u9 `* \7 p
- echo '</p>';! u$ `% L6 m; M. d% m
- // 递归扫描& e1 [ Q5 }% }5 q% y7 U
- function RecursiveFolder($sHOME) {
; i Y/ s5 W% z - global $BOMBED, $WIN;
, ?6 f8 u( H! ^) z' {' e - $win32 = ($WIN == 1) ? "\" : "/";$ p, A( m0 o) w( d, j# I ~- R
- $folder = dir($sHOME);1 E5 B( G7 n1 b1 v9 ?8 |7 w1 x, W _
- $foundfolders = array();
- ]3 K' ] |2 x! p, F - while ($file = $folder->read()) {
; S! m6 b8 U8 f/ f( W- F2 M7 y - if($file != "." and $file != "..") {
$ _6 `/ z6 S( E - if(filetype($sHOME . $win32 . $file) == "dir"){* [# p" d8 X* Z
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
: s; D. x) Q3 C5 ~4 m7 |6 p- R+ c - } else {* D6 l- e& h& Z8 G- N
- $content = file_get_contents($sHOME . $win32 . $file);
4 S8 K0 [4 e" n" E& v P: |# O - $BOM = SearchBOM($content);! @+ ?0 ~7 u: ^9 c1 G
- if ($BOM) {
# f( I" M% i/ [. {+ `3 Z - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;2 s' M6 J' n/ t' E3 _, e, L; i
- // 移出BOM信息
: b/ l! V& X- u$ }, H. c - $content = substr($content,3);) D" E: w0 R1 J, v
- // 写回到原始文件
2 I7 u J: D5 l+ l W! y: [( A) R - file_put_contents($sHOME . $win32 . $file, $content);' I7 ] T( L1 x" P& r7 \9 g8 [
- }8 t2 F& f4 ^; L V
- }
! r' n2 }' t& W: c1 G - }$ h% i8 |. n I6 G
- }
% e2 Z2 M; Q2 t2 T - $folder->close();
( g" u0 O; Y' n/ ^+ Z+ |$ k - if(count($foundfolders) > 0) {
( z5 b* {: b* I0 v1 s7 W - foreach ($foundfolders as $folder) {" V; W( H# P4 P1 E3 M- ^
- RecursiveFolder($folder, $win32);
# {! ~9 e" ^0 _( l1 m9 F. f( h - }. i8 u7 \& S& t: w
- }
. g# o3 N7 C) S& z - }
5 S; N0 L6 j* ^9 S# e) x5 t- R3 P - // 搜索当前文件是否有BOM: g. W' Z8 o. r7 a% \+ i
- function SearchBOM($string) {
( [- d, N/ r8 _% s - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
5 y2 i# m% P1 ~' d. u/ z - return false; + N" e/ K7 L+ F# U( u7 k# A* f7 g h
- }
' ?1 a( _% }' j - ?>
* C+ ?( Z" Z: B+ Y$ M - </body>
7 J9 ?( `3 {% K9 ]. G7 R( R - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
$ A( B" }0 z% n& H8 {
+ B9 `4 {1 A; ^7 T0 V: v2 l |