模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
& |% i, P) U% G
7 @4 k- Z# r+ o8 `; |) q2 K9 l这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。0 ?- S: |* n+ j5 ^! p& q9 I0 J( Z
: M6 X/ a! H. F E, O0 ^" ~' G, x3 S
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。6 W) u# i' s) o- l( ^, Z
+ R* r8 u1 Q; A5 ?" Z) G# v对于一般的文件,这样并不会产生什么麻烦。7 t4 x( n$ J, x7 j. o1 U1 l
. Q* k/ s1 C' @) H
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
' w" K9 j+ e+ i. C
' f% S1 f/ h3 o根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。, e7 ?/ y6 H3 E' N
* }# d9 g* e- y: ~, S由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!0 m0 q- |0 U! _- |7 d
3 l) v& z/ G: S! X* h: |
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ' O: a* ~, i3 z x
' l$ M! W' j) ~6 |: }4 p7 t7 ~) G. z
然而文件比较多,又想偷懒下,使用下列方法来实现。
; ]: s5 z, E9 E2 T6 |) A8 }' Z* B2 u% u- b# Y* O6 b4 F
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
0 [5 ]$ ?. ]# W
2 K4 T4 X( `% H3 y0 V! [, m4 b) ^4 A
- <?php : Y! k, X# q" @
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)- k- o8 j! M8 z- U2 x, Z6 M
- $HOME = dirname(__FILE__);* J1 S( l6 X3 ?0 J
- // 如果是Windows系统,修改为:$WIN = 1;; b3 @) ~5 c8 K6 [8 m
- $WIN = 0;
/ V; L5 ~3 a+ ~5 w( y+ E$ L8 w - ?>& g+ B9 H; k& Z$ m- @/ y4 s
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
$ h* J" n5 Z8 f' Y* f& O' ^0 K! I8 [ - <html xmlns="http://www.w3.org/1999/xhtml">
8 N1 U! i1 |7 d/ e# y* X# S) M9 ? - <head>
% B# c5 q/ W1 H - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
& @" [: m2 T/ g4 ^ - <title>UTF8 BOM 清除器</title>
% G% z' i/ [; r4 E7 ~. u - <style># m1 c1 Q' _/ |+ r, |* |8 @# T
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
. X* Z7 y; f- l) `# U - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
) Y4 X% m# e& u - </style>
7 l. k& R) b$ F0 D& C$ q - </head> Q$ @! \! j4 Z: b7 a1 q8 u
- <body>
) o4 m; Z- B' B/ e1 z0 L* N - <?php! N, o* G# D8 m- i A! |. J
- $BOMBED = array();
2 |& r- L; [, F* u/ l* y# P, q - RecursiveFolder($HOME);! X% H4 p/ ^; u) [
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
; L$ t, p$ G; g4 q5 @8 C# e" U - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 `0 {# H, V. b; o S2 f8 z
- echo '</p>';6 k0 ^+ h. [' l$ f0 ^1 n+ e
- // 递归扫描6 A. B9 M3 V3 v: S! r' m; l1 b
- function RecursiveFolder($sHOME) {
1 V0 K/ f( f3 C0 G8 D4 u - global $BOMBED, $WIN;' ?3 E* m: z/ m, M, T
- $win32 = ($WIN == 1) ? "\" : "/";
* q( O4 w+ O7 V4 v - $folder = dir($sHOME);
( J3 b8 T! u( h! z! I - $foundfolders = array();( W" J4 r1 j0 a. V! U
- while ($file = $folder->read()) {* L* z" K5 K! j, n2 `
- if($file != "." and $file != "..") {
" J( y Z" ` v& x# O- g5 ` - if(filetype($sHOME . $win32 . $file) == "dir"){
) j9 [$ k9 V, M3 z6 S3 A& p - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
0 @, ]4 G0 ?' T - } else {
. P% k0 W& W! H5 k, @2 m5 u - $content = file_get_contents($sHOME . $win32 . $file);
/ P/ H x6 ~' ~2 e - $BOM = SearchBOM($content);, |+ p: C, p+ q' X, G1 S9 I
- if ($BOM) {# K/ l8 G5 W$ b6 c
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;+ g$ p n5 _# Y5 l
- // 移出BOM信息
$ z* _. A! o0 [& ] - $content = substr($content,3);
0 e* @9 ~- w+ x5 P, ^ - // 写回到原始文件5 N/ i4 _9 A0 d$ J0 V
- file_put_contents($sHOME . $win32 . $file, $content);
+ {4 C0 P# w1 j* F$ J/ n- a2 r& c - }
# U3 l$ j& a" U0 S; `- w - }/ s9 p Y! B+ Y1 D% z Y
- } `; p1 n$ n9 C2 k
- }* d2 G8 j+ }8 M( W G
- $folder->close();
8 r1 b3 |/ f& y' T% X; t2 V - if(count($foundfolders) > 0) {
! ?& p& s+ @( j0 H - foreach ($foundfolders as $folder) {6 Y3 T5 y5 ^% z& I" t
- RecursiveFolder($folder, $win32);- L: t( x. G; I
- }
0 q* W. Y- |4 U- P - }& }2 _; i8 d" p5 q1 w. f M
- }
) \7 E! k- E- N$ \ - // 搜索当前文件是否有BOM2 K, w# i$ z+ w) I5 r7 i0 Q
- function SearchBOM($string) {
1 \) l4 S) i' f) x! A - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
8 p9 I5 F# e1 J. u# T g0 t/ V$ f - return false;
' S1 Y: u/ m' V$ y* V - }/ p% ]- z! S. w; G9 l/ s3 b
- ?>9 g# @) |, w3 |; ^' X# ^
- </body>( r4 E- s3 |: ?) x' @+ h) Z7 M) }: J
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!6 x: I5 x3 Y/ Q2 @) F- b: Z
5 R! w# g9 `; g5 b+ b6 ~' ~4 \: s" r |