模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
6 K* j& S* V3 P, X6 {! _3 f8 d& x! w8 e5 P
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
- A/ ^8 j5 D& J! ?) p. c( j: e
9 f' Q. z) \/ k- i E: T它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。% }: e1 h# p" t% |- }6 m
' z7 D( G* w$ B对于一般的文件,这样并不会产生什么麻烦。6 q" d" G& K6 Y5 i" r
8 g v. m- Y z! b' D3 D% l但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
) q1 f C- x7 L' _
) U2 k" q9 `4 c5 O- e; Z1 n" u+ A根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。! v7 r7 X# X; m0 d; I5 h. L
# y( Z9 X; k/ r7 f _6 g# b0 z$ u
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!! u- {! ^0 a$ e' o7 h2 G5 G
+ b: u0 c) ~: l$ j" i/ p X直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
k; R8 n) y% a% ]3 p% R @+ x/ s1 X! y7 E1 N% w S
然而文件比较多,又想偷懒下,使用下列方法来实现。
' a# Q9 E; N2 y% |9 m d% L
, u8 T3 G# e4 m: k将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
H& _7 S# e9 d3 A- |8 K( v3 G6 n/ g4 F8 d% L4 _+ V, d; a! E% [; I' P, m
, s6 \! \; ]& H( R- <?php 0 u; V: Q$ |/ N$ N: \0 f& O" R @8 ^6 f
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件). ?; \/ Y/ M/ x! M2 B2 ^, I
- $HOME = dirname(__FILE__);4 G" S) g6 f, d4 Q9 F* c$ x3 M" p
- // 如果是Windows系统,修改为:$WIN = 1;2 v2 R( p" a) j, a! H# m
- $WIN = 0;
: z. u/ t9 d1 d$ T - ?>, M6 f- Y6 L9 Y& R7 G% x
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
: f. s$ l+ y' A2 S/ h' T/ x. X6 F - <html xmlns="http://www.w3.org/1999/xhtml">
6 w9 |! s a+ ^6 N" o - <head>
% r3 h/ U: I- m! C# A - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9 x$ s) ]4 |8 i, O$ N7 A0 ^/ w+ s - <title>UTF8 BOM 清除器</title>
/ [8 J: F8 N/ W- | M/ d" g& D! m. b - <style>
, \6 L! h0 j3 A$ ^) N - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
' Y Q% l1 k0 } - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
5 C2 `( x# Z' p' k! z& N - </style>
# M) s, l6 I X3 ` - </head>: w% O! F' `4 a+ n
- <body>
, z, I* e9 C+ {6 R. \+ f8 B, ^ - <?php# e$ }9 \: x) Q( ]: }
- $BOMBED = array();
8 a: t- K$ p+ d8 ?' P3 ` - RecursiveFolder($HOME);
8 A2 C6 m& \/ ?* Y: D# t$ ]2 d9 ^ - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
" ]8 H7 G3 V Y1 ]: l9 p) c) b' { - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
1 K. d6 A- A$ S - echo '</p>'; D2 D4 s5 x, I$ d. [. y
- // 递归扫描
0 L5 J/ L) p$ P8 X4 H. I7 Y - function RecursiveFolder($sHOME) {
8 O# r. u- Y, y$ r9 q8 {5 ] - global $BOMBED, $WIN; b7 X, N# j" r! w
- $win32 = ($WIN == 1) ? "\" : "/";
7 q% q0 X$ s s0 p - $folder = dir($sHOME);7 i+ L4 h" `' T0 |+ W( Y5 L
- $foundfolders = array();
T) P7 {$ _! E! q( i% ^ - while ($file = $folder->read()) {# u6 u& X2 F) J5 k# e5 P5 g. R. W
- if($file != "." and $file != "..") { d/ q \3 Q0 `" X/ x
- if(filetype($sHOME . $win32 . $file) == "dir"){& x: E# B$ M2 n" `
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;6 t) k; n% i& u) \
- } else {, S& d1 r4 P' R; {! [9 n4 Y
- $content = file_get_contents($sHOME . $win32 . $file);
# ~$ J m% Y) _; W - $BOM = SearchBOM($content);' i: E9 ?+ C; G) P; z6 t
- if ($BOM) {6 @: l( j$ r+ B- z
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;" C A0 K: t0 y" U6 n2 `& x K, ~. ]
- // 移出BOM信息
2 ]. ?1 P& \' M# r+ Y - $content = substr($content,3);4 a4 }9 s# ?. r) ~7 I! p M g
- // 写回到原始文件: G9 q+ ^0 v. J, J* W
- file_put_contents($sHOME . $win32 . $file, $content);3 a6 P( Q3 t3 e4 d/ A8 W& N- W8 |4 U
- }& v% H1 M$ ]) w8 }! [4 o; ]
- }
9 A I/ \) O/ j6 j9 z) X+ o' N0 t j - }$ l3 t- q' v% n9 L( [
- }
( F" h+ p/ z( X8 J, p - $folder->close();
0 Y6 j# U5 p1 ^6 \6 d: O% U - if(count($foundfolders) > 0) {5 g1 y& K( b% N1 | r3 J& }0 U
- foreach ($foundfolders as $folder) {' t! T5 D* {( ]* V
- RecursiveFolder($folder, $win32);
8 S, r7 s/ }' u6 y* H b( X - }
: W, c% T" S" o8 h6 F - }; e( d/ p. {6 d0 |$ R ?1 ~' J( C% f4 r
- }
% a3 M" t' W; V* C* m& L8 F - // 搜索当前文件是否有BOM3 Y$ D7 b( _+ W. H
- function SearchBOM($string) {
9 n& {3 B+ t; F) O _) p - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
9 x0 s" u# F3 K. P4 p9 a* @1 v6 `% R$ W% u - return false; 5 T: \# v' W4 j9 r0 u1 e
- }) i- O! J4 h, s. E, |
- ?> |3 m9 Q# I/ S
- </body>
( j B' T4 O" L8 K - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!5 _% @+ D7 k& `
3 k3 e. h( F8 P E |