模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 ( C8 x0 e' \. N- @; v! Y* V
4 C- k* e4 Q* Y0 D
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
& }/ Y3 p, W# x# |6 g# @+ X/ w
+ `* ~$ \' r5 i$ r$ M+ D! W; i( C' G它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。7 a6 u0 U6 k) Y0 O% Z8 R' T
" q7 T; k- C* s. [% o. q
对于一般的文件,这样并不会产生什么麻烦。8 X6 K2 a3 _6 s/ i$ ~
/ p, W H% E0 v2 l# X
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
4 O) ]. M! x3 c3 x% O* v+ h/ Y; u
* `. R* X* c7 x根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。/ x, {4 K [& {5 v+ O- z
) A% _* n% w6 S' C8 A由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
5 @4 N/ B9 ~2 I1 |6 m# U
A. t) b! _3 K直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 3 N' _1 R; s8 l
- M, Y/ N& g$ i. }
然而文件比较多,又想偷懒下,使用下列方法来实现。
8 M! b: f3 H0 O5 p2 C. M$ ]' i1 y' G3 p0 D
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
* L1 X" K# w2 E1 i; r6 V: g$ e9 u, ]& C7 g: p3 ?& o. S5 q
& @5 W+ h' J; D7 X
- <?php
0 f2 z" Y! _& M1 N+ J- Z2 P2 e& n - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件): Q4 Q( N: g' z. a2 m1 D# M
- $HOME = dirname(__FILE__);4 f4 r/ k0 {$ N+ X
- // 如果是Windows系统,修改为:$WIN = 1;
+ h' B6 h# h7 s* V3 \! n - $WIN = 0;
9 F/ C, ^. ]' O - ?>
: ^1 j# p% [8 S) D$ } - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) R9 ^9 ^* D1 m) x. f5 h: ]) F
- <html xmlns="http://www.w3.org/1999/xhtml">
* I* `' A* F7 f) r/ x( a; j6 L( Q - <head>* i2 G* x' ], ~1 |; ~" l& x
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
, p R) i: ?* A2 y; r/ Q - <title>UTF8 BOM 清除器</title>
$ r. @, L2 I! x/ Q" t# m9 R - <style>
: N+ v: P; |5 p* i2 m. `2 V - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
- E9 S1 O1 T1 {9 o& ~ - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
/ w7 @2 x" D" s0 ` - </style>2 A: g) D* V4 U9 V
- </head>
5 }& G- v* Q% U& p Q0 x - <body>
5 R: E2 b" ~ i& M - <?php
) L/ k; H2 {* r# G - $BOMBED = array();
9 f8 `6 Q, n8 p5 [$ U' J' y - RecursiveFolder($HOME);
1 ]% }- m) Q* x9 L5 D# f/ A2 M" a - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
$ P$ ]* a2 w |+ t& l2 Q! i - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
( B1 ]" P8 R, G) N - echo '</p>';* }$ E2 j m0 ?
- // 递归扫描0 Q' `4 B. S4 H, |2 V$ ~, r
- function RecursiveFolder($sHOME) {
) ?# Q# _- e# n% J) Q! n! b - global $BOMBED, $WIN;! k" I7 g2 ^7 L, s- M$ b' k, U0 t
- $win32 = ($WIN == 1) ? "\" : "/";. b2 L1 J' y* [2 ^
- $folder = dir($sHOME);2 l* k$ h E6 k7 Q9 |1 X! `$ X6 k
- $foundfolders = array();8 ^+ U e8 I0 f. ?
- while ($file = $folder->read()) {0 Y$ A$ ?- i8 U, r% n" e+ t0 s; p
- if($file != "." and $file != "..") {2 b9 G [ r% e0 p- n* b) m5 g
- if(filetype($sHOME . $win32 . $file) == "dir"){& y- J4 X3 x) \1 N' X- ]
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;9 g" B% ?5 d F8 f J) E
- } else {, g0 V* Q7 X8 Y# [8 l7 Y( k1 t, m
- $content = file_get_contents($sHOME . $win32 . $file);- D( N$ n" n- n6 Z# M @
- $BOM = SearchBOM($content);
' E5 l* d0 [6 }0 N2 i2 _ O - if ($BOM) {9 ~/ s1 z6 J7 R% l- R( ?& X
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
1 L/ k8 e7 \1 F9 n) L: L! O - // 移出BOM信息
* g7 c+ j6 T" u7 s, ]) H - $content = substr($content,3);
( t' m$ Q' a! A+ V. R& E - // 写回到原始文件
: O% m( w# ^% i% X# | - file_put_contents($sHOME . $win32 . $file, $content);
( B5 T% ]) `7 m B& ~ - }
( e! L3 f! j: r4 ^1 |" C - }8 H0 s4 R( y5 h# {
- }8 [: k8 i* j( e6 X- Z1 k- Y
- }
% G7 t/ a9 a/ E: h0 Z, a2 N; v - $folder->close();9 O) w$ D+ P: y
- if(count($foundfolders) > 0) {: R3 H$ x# Y ], s+ v
- foreach ($foundfolders as $folder) {
6 A/ Y+ z$ @; E7 q a5 r6 V - RecursiveFolder($folder, $win32);$ b# h' g U% u% ~3 [
- }% ~, d4 G$ R$ \7 M; W N3 @+ i2 }
- }3 I( A) J$ Z. x2 P
- }
; w, E# y1 d8 I. d3 W; x- P8 }4 i - // 搜索当前文件是否有BOM
. Q/ a. k% T8 J. ?, K7 H/ Y; D2 S - function SearchBOM($string) { 5 d* e8 S$ N) X
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;; R% d, O1 p& Y o. v( Q- T% o8 C
- return false;
/ q9 t v( V9 d. U; r7 N: f* j2 b - }
! V9 a2 f- \4 S% `/ t - ?>
8 c7 F" \: g: K. v - </body>
! o, @* h1 ~" x6 ?& _3 E3 V# E - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
0 t. l1 U; z1 ~* E9 K" Z
1 O+ [, [5 p- v7 p, v$ \0 C |