模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 0 f! ]' B& M' l& N2 }
& a: }9 j+ u. t1 H; ?9 x这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
) Z6 R/ L# O6 [- `7 m0 M9 r
( W% V" }: _& @% q2 B5 G3 @4 d它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
: s( |: |1 U1 X8 X3 X4 b# J
( e9 s$ _- G7 k3 Y8 i对于一般的文件,这样并不会产生什么麻烦。
2 Q* o5 g( o, H" ^/ y) M. Q/ k
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。: J: ^( \& b" \* D5 |2 x
9 d) X$ Z5 O$ w [4 O根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
8 E# X: {3 u9 j# c A# u4 y4 f" U4 y j0 X
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
: ~2 V/ I. u, ^1 V8 ^( o; r7 I( o" @$ \' V
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
, j6 B7 t; B4 l/ J# a! B4 [1 O b: ]- T5 L
然而文件比较多,又想偷懒下,使用下列方法来实现。
3 b1 E4 ^: q' x. y
6 X( N; a8 V5 n& j8 {% c; Q将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换/ p# Y( `/ ?3 K* \+ h
/ p- p4 i6 A) ]7 E4 H3 h, H: `5 ]
5 T3 P5 X6 ] S9 T$ B
- <?php
L3 b2 ~, O! \8 G$ l* R - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 b) }" W2 [4 f. \- M8 Q
- $HOME = dirname(__FILE__);8 p7 Z* `3 ]2 T, V4 Q5 g4 }6 W5 x6 r
- // 如果是Windows系统,修改为:$WIN = 1;; m0 W u( q* @1 k) i; U% R
- $WIN = 0;
3 N% z" u: N" }" ` U9 G - ?>* ~9 A3 u5 x7 u' k9 v1 }! {% |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
; E0 b7 p, s6 u0 M5 s& C- @* P& O - <html xmlns="http://www.w3.org/1999/xhtml">
0 O& G$ ` W, Q3 h - <head> C Y, J/ D) s/ g$ i
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />/ k; S" k. S9 ~. u
- <title>UTF8 BOM 清除器</title>
. W( D9 n( e# t - <style>
^1 N3 Q. c2 {' F& i0 r1 l5 E3 f - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
{9 M* Q3 v! t: @) J& v5 P5 N - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
+ Y# `% c9 U9 R7 {2 a - </style>
$ G: h9 p& t8 d - </head>% D/ C+ Y- d/ R+ r1 J6 h* h8 t% Z: J
- <body>
* m, N, x0 S& M& p- t - <?php
6 t7 j2 o% h& F. u$ Y2 Y' t - $BOMBED = array();, f. d& l/ h. s# D
- RecursiveFolder($HOME);) h; Y5 h% d1 I* B
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">'; m7 Z6 C( G! _( B* P d3 K
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 h9 x! u; J! u; Y! B1 V m1 u$ X
- echo '</p>';* d; D+ [" J0 t1 G' @( A
- // 递归扫描
8 c/ `/ |# r! e! ? - function RecursiveFolder($sHOME) {
- R7 X' i7 T8 w8 a2 m - global $BOMBED, $WIN;3 j/ ]' t6 V d
- $win32 = ($WIN == 1) ? "\" : "/";6 p1 l' p7 x E: C1 [- h
- $folder = dir($sHOME);
- U3 b& m, A: U2 f - $foundfolders = array();
: j" c. E* `0 O - while ($file = $folder->read()) {
" h( o2 I4 d+ i8 W) f x - if($file != "." and $file != "..") {
O: ^/ Y: i7 ?. |; P! B - if(filetype($sHOME . $win32 . $file) == "dir"){+ o) B. W9 y- i, V; R
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
' {3 B/ C6 O5 Q' m% c, O" h - } else {$ p% w" c# i4 r ~8 ~6 _
- $content = file_get_contents($sHOME . $win32 . $file);6 P/ Q( q2 p! R
- $BOM = SearchBOM($content);
) }0 I. a8 X4 A/ @ - if ($BOM) {0 L+ | m# R0 I: u; t
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
1 a9 [& ~4 I0 p% H - // 移出BOM信息
+ F4 L- _/ n8 \4 I. M0 C/ A - $content = substr($content,3);
% w0 ~ B( A3 A& Y5 J - // 写回到原始文件
& v2 c* {% _8 G8 m' q r - file_put_contents($sHOME . $win32 . $file, $content);
) Z4 |5 O0 x+ o' O8 u - }( g+ E m6 ]. R1 V1 }* D
- }: O, q4 e; }- M5 t
- }
0 I, \4 _! ]8 b6 l - }% ?$ A0 ~ l! e( s9 o4 o* M
- $folder->close();. D, e$ e# x% n
- if(count($foundfolders) > 0) {* P. \5 q: z/ f9 Z- j, S- u
- foreach ($foundfolders as $folder) {
2 k0 d# u2 o5 [! @ - RecursiveFolder($folder, $win32);; M0 U5 {: E2 z2 p6 }9 U& r$ y
- }& ~$ P) ?4 w& [+ w2 ?2 J0 ?, D) x
- }
" b) d# w7 R: W5 i; l( c4 ]% y( [ - }% e5 p; h8 Q7 t
- // 搜索当前文件是否有BOM
3 }7 y$ m/ Q1 j6 s# t - function SearchBOM($string) {
- F$ r( M w1 s* L - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
& J, i- R4 N" l% }3 M. t% {+ o/ n7 I/ Y - return false; 4 W; y3 G, S5 p5 \
- }! j+ V8 l' J# |3 T7 {3 Q
- ?>
# S# N- ^1 Z( a* L - </body>
& I% l7 [# n. G - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
7 Y+ U O, \; U7 d* L* C+ L
% @' M, f& {" l1 V8 H2 m9 e |