模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
( a5 g8 n. E% I" H( Q5 |, f
. L% P# z$ {7 b0 p这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
9 L$ v6 u0 a- ]; z+ O" w( P2 k. k
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。5 r$ D8 \1 U% l4 m d% M
% P: J: p7 l# a3 t, a6 H8 ^
对于一般的文件,这样并不会产生什么麻烦。
/ b! H3 C) W0 a' M& U6 R9 v: T M9 H6 h! b+ C) k* _3 {! _
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。' n2 y. D: J% ]. U: c3 Y
' {# {# z4 a) |- K1 b) t; Z6 ^6 E
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。+ u- }: k; }2 X1 c0 Q, A+ i
& ?/ G1 U4 p6 t9 B4 q7 p1 y
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!$ M4 S2 e0 X8 c7 M
8 j% v. i1 G7 U+ U$ [! M直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) N3 y7 i+ y; M8 J6 N
2 Y, G. ^! Q& v8 u O( _' {2 j# T然而文件比较多,又想偷懒下,使用下列方法来实现。
/ L; M7 T `; {6 o" [
9 N: `+ N: I9 P4 R将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换( C2 x0 M7 d3 u" P0 f0 @9 I; W+ q6 ?7 ?
$ p% J2 r8 M; S
, ^* H: X- x1 u1 S# U
- <?php
' W7 Z' Z8 R& S& A0 C4 M' s - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
+ z6 m s+ u2 K/ I( G - $HOME = dirname(__FILE__);
4 a/ i A3 z) U- E! J - // 如果是Windows系统,修改为:$WIN = 1;2 n% S; P8 Y& E8 J1 w- H( r
- $WIN = 0;
[7 }, k( O/ y2 d - ?>
, B: u/ F$ K( y8 Q7 u5 f x7 S7 Y - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">. w- L* A6 x& H. t: ?7 D
- <html xmlns="http://www.w3.org/1999/xhtml">' `( r6 z4 O2 M) X5 U( t( a
- <head>. j& s* V6 w$ M0 M2 V, l) j
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, |8 `$ }. o: E' d3 o: P# G
- <title>UTF8 BOM 清除器</title>
: D# r4 D4 U! T9 V( s - <style>0 \. ]3 @2 |5 {, I3 V0 F7 k
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
4 I2 Z& S- h1 l: C% p* R) l6 R - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }" o, K$ F; d; \. z1 h) i
- </style>
1 l* V5 k% T2 l# C5 c - </head>
, ]) B% f3 z! f - <body>
" F' M$ ]$ T5 k: O! |. Z2 f - <?php+ w( n$ a5 E$ p- n: @ }
- $BOMBED = array(); Z: i5 D5 f @ ?
- RecursiveFolder($HOME);) R3 B, e/ m( E! D
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
" M |% z) P+ d - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }% r% M4 E& z4 b
- echo '</p>';5 z: a5 v( W! `+ X& K4 @
- // 递归扫描9 q" Q4 j5 C1 r8 f; X) S4 n
- function RecursiveFolder($sHOME) {
$ s9 _+ K, A4 t9 i. k - global $BOMBED, $WIN;
& c% S, m- Q0 i; r; Y$ L - $win32 = ($WIN == 1) ? "\" : "/";, O: ^" e0 {, A+ c% c. w
- $folder = dir($sHOME);' i2 I- P$ g, _
- $foundfolders = array();
* [$ n- I4 A5 Z3 n1 y% ] - while ($file = $folder->read()) {
. s6 g1 x5 T* b6 z) ` - if($file != "." and $file != "..") {
; U2 P5 w4 G/ ~# d$ z' l - if(filetype($sHOME . $win32 . $file) == "dir"){3 S( c G4 B8 C5 i3 R7 A# k
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
v% t3 Q+ |4 i" U# c u# ~) [* i - } else {1 Q/ j: h0 O8 x# g# r4 r& _4 S! B
- $content = file_get_contents($sHOME . $win32 . $file);
0 q: ]* E0 W7 {8 p6 C - $BOM = SearchBOM($content);; R3 n& G; J$ s6 d7 ]+ Y7 Z: r
- if ($BOM) {( ]0 @: i) Q8 i
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;+ P/ m7 M. o; {; U3 j# `8 r
- // 移出BOM信息$ M0 G6 h' J0 F7 H: O
- $content = substr($content,3);
) s. W$ N P) ~- ^, I) K4 x1 o - // 写回到原始文件
3 G2 l) a0 ^) [ - file_put_contents($sHOME . $win32 . $file, $content);
+ C; l8 o. r B9 o: R" z6 s - }
# D# x2 m3 a# [, F% H5 q* P; a/ { - }# j& o" i `, l
- }
: v7 B/ J d2 u. |5 c/ L8 W - }
! J* f& [% q. d r - $folder->close();+ A' F+ }; D" V' c0 r
- if(count($foundfolders) > 0) {* ~+ v! o( U6 o
- foreach ($foundfolders as $folder) {) U L, T" d7 u8 S- `" I, @- j
- RecursiveFolder($folder, $win32);* d2 g- o( i& v& f$ Q
- }& b: @! K' v/ r; `
- }
/ K( m9 P0 D- x) m6 z& C R# v( t& u - }& N, P7 T- u' p2 g
- // 搜索当前文件是否有BOM
, C; s2 Q# G9 N$ T; J - function SearchBOM($string) { 3 I; M. }+ x7 H- X0 r# Z% U9 j
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;3 R* D( N6 w1 V- x7 L3 I% ~# U
- return false; 3 r" |4 ?( _& d6 R+ \2 ]9 u, D
- }: t/ h! V; O( V; ~$ K
- ?>
" N7 O0 P" r1 d' a& Q6 o V - </body># b: P5 r, ~! t; z6 Q' L3 K, G
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
, [. c/ }6 \ }) i, P, Q
9 P0 s) N( V3 a1 r; W3 ? |