模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 1 ~8 }( t/ g) S+ `( l- S! H
! C, o' d* S' e! @7 v
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。& d& W+ C$ b) ?+ i* k7 M. l1 F
9 j5 W- R4 ~ ]0 R6 r% I
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。1 l2 ?; |& Y2 e
$ |5 P0 M6 d6 c, E" c( y
对于一般的文件,这样并不会产生什么麻烦。
R: \. p, x: Z8 A2 ?6 Y3 p' @ Y/ q$ \3 P
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。( i! w) u% [6 I; G
8 j1 }2 q( @) S$ X+ x @根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。" s) O: \! y6 l0 \1 d a4 d( _
( _! t6 s) l# ]! S& x
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符! {( F) ~, l: e! [* I# y
5 |" Q0 B3 h* ?5 a2 o4 ^
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ( ~! v" F5 @* V2 L* _) P
: P5 a' R% }/ V ~
然而文件比较多,又想偷懒下,使用下列方法来实现。
) _4 R$ d6 L' B6 A) @ |. L! n+ V1 e' ^
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" A* {; D: \& O/ E( [
8 T- X, Y. ~ R4 v4 p% O8 z/ U+ E4 Q3 v$ ]% v, F9 ^
- <?php " ]$ u3 i9 x: \/ V% y+ B
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)+ e9 `6 y. s1 @* h m
- $HOME = dirname(__FILE__);9 ~$ `/ p' |" j1 F% h0 T/ A: ~
- // 如果是Windows系统,修改为:$WIN = 1;' L1 |5 n( ~" d1 w* R7 A ]
- $WIN = 0;
) Q- w% P8 M* V; V3 u - ?>
7 w' e% q: u% K6 F - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 E5 z0 P2 S2 u2 y" n5 I& C - <html xmlns="http://www.w3.org/1999/xhtml">
+ ? I. P& Y0 j: G7 K% ` - <head>
$ q0 U5 z- i$ i, _ - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
S5 y- w9 y, P8 I- s" b - <title>UTF8 BOM 清除器</title>% |+ c V- \! c% g4 P5 n
- <style>( e& t( Z9 \( }. s+ T0 w
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
& X0 D$ z- m; v6 E1 M - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }/ I8 \6 ]4 k' ?" B/ \, q
- </style>6 K I2 w: w5 ^: a+ M
- </head>
1 v; A; h, i0 X# i/ D - <body>; y& q, I. Q3 B6 [
- <?php+ o7 M# G7 m) Z4 t
- $BOMBED = array();+ e, |1 O9 o4 a5 r
- RecursiveFolder($HOME);0 X/ v. B" o3 N5 Q* [! p1 C
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
; C' e/ F6 }- k5 V/ x" l5 r - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
& u) |1 R' Y1 q# ~/ [4 P - echo '</p>';, N: ?& r# U$ H$ _9 A
- // 递归扫描
! c8 O5 B" M! y! G1 ^ - function RecursiveFolder($sHOME) {
9 H2 z q2 L$ ?4 ?0 S& w - global $BOMBED, $WIN;/ I4 D M: n, ]! |; [6 \
- $win32 = ($WIN == 1) ? "\" : "/";) m. z, `) Z7 v3 f8 o, T/ z
- $folder = dir($sHOME);
2 A' d! [' Q6 b% e4 l8 Y4 i( q - $foundfolders = array();( [7 f$ Z& K* O3 P
- while ($file = $folder->read()) {
# B# v# B4 c: Y# ?+ y - if($file != "." and $file != "..") {
$ K% u4 C' a- r+ v+ ~* N) U - if(filetype($sHOME . $win32 . $file) == "dir"){
5 O8 ?3 c- g1 }/ g- q) B% a - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
6 z4 s# n5 y K0 ?. W - } else {) E% p) ^( O6 |. Y1 n
- $content = file_get_contents($sHOME . $win32 . $file);- v3 J' W% w1 k
- $BOM = SearchBOM($content);7 k: h4 b% z3 w. r9 Y* L
- if ($BOM) {$ V8 E. }2 p* l/ i
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
; J9 }- ~$ s4 j4 Z j ^ - // 移出BOM信息6 M! K; j+ T; x% c5 c3 s, E$ v1 C
- $content = substr($content,3);
# y2 [9 j, w' e$ _6 j7 v - // 写回到原始文件
- c- r4 s0 Y* _5 ]" A! Q1 X* K - file_put_contents($sHOME . $win32 . $file, $content);
' q4 z% F) G$ ?/ G& X; B5 h+ n - }' r2 ^) R2 R3 C
- }
5 s" b( s0 @7 u7 s. t t - }5 b5 o+ f1 o) s6 W: j# m
- }' |6 h; ~, L+ s; J) w' x
- $folder->close();, A9 h% V, C: S5 ~5 S
- if(count($foundfolders) > 0) {# I; F1 h- S0 u1 w0 e8 k. g" l
- foreach ($foundfolders as $folder) {
1 e1 K4 R6 o" u/ U" [( L - RecursiveFolder($folder, $win32);
6 h9 x2 ~0 ~9 M6 C3 N; o$ A& X - }
, v$ Y8 _6 J4 k - }
6 z$ h' U% K: e5 ^9 `7 X - }
/ ~1 T* S5 I7 n: n3 B0 q6 b - // 搜索当前文件是否有BOM
% a: g9 ]6 V' r8 n( \( k5 } - function SearchBOM($string) { ( J7 D/ B6 R7 }
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;; z) T5 C* z% Q- h' b1 v; {
- return false; / U7 d: O$ }0 [6 z3 b# A7 m
- }; ^; R& s4 ^$ l( f
- ?>
9 F; a. p: c' I( ], f - </body>! A* u F! p+ A
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!0 | s2 ?% N4 }. L( v& u
% n& h# I* O' H- c" j- ~
|