模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
/ g8 k: v8 P$ u% [: Z% T: y( _2 r% U& v/ U' ?
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
" L1 a, g5 ^) e4 S {1 D/ {
. Q. I# b2 H0 a: I它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
0 P3 H. G# z5 I/ N
0 V3 C# M0 k, c7 k' R对于一般的文件,这样并不会产生什么麻烦。
5 o6 t7 X4 P2 H, q. {, q; c2 \/ M9 p! D
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。1 V9 C2 ]& e6 T# ]6 i' E
, V+ T( A4 B) U( f% M
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。% p. `, e: x+ c m6 @7 X3 ~: E
* G4 \3 \4 j7 X! {
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!8 ]# X( T+ j5 V* l* f( B7 j" w) p) e
& ?% ~! @- y: N# ]: f. H3 E直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
0 X8 o" A5 \$ n( p9 }. j# H7 g1 J; t/ h3 y6 D
然而文件比较多,又想偷懒下,使用下列方法来实现。 ; H7 {, p# O$ y6 H/ l1 J
8 M& A# |. c1 t4 N) l将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换# `6 e6 ^, p! h0 h
, E& g6 }+ L$ U- v& f7 F
, Z5 \$ S) H7 H2 ]! V- <?php
, ?) r/ g7 Y1 M% ^ - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)6 p' _ T' ]- `+ E; H+ K5 K6 p$ ~
- $HOME = dirname(__FILE__);
# R! j3 D a3 U! Q( W! F; f/ G - // 如果是Windows系统,修改为:$WIN = 1;3 T8 A2 z* H; B+ x k/ S, j# J
- $WIN = 0;( |- \; S2 h+ |' i% w( K( i8 Z% C
- ?>
8 {3 }! z4 h: E9 l+ S7 R* O. O% n- y1 b - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">8 P1 E+ L+ j2 b9 q
- <html xmlns="http://www.w3.org/1999/xhtml">0 n( J; J2 |1 J/ t: G. _8 x
- <head># \# R: ^- C: \4 ^7 Z
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />1 X# }2 L# i V( y
- <title>UTF8 BOM 清除器</title>" p ?; ^9 N* Z' h/ I# ?
- <style>
) @4 X( A6 S( C, C1 C. |3 H - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
+ ]' b# S1 j1 u6 C - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }3 ~1 d, i# w& i( f1 ]: E4 X
- </style>' z, X+ ]. t. `4 J7 \: ^+ ~
- </head>& L7 N/ \4 y1 i
- <body>
7 _8 F/ d, A3 `0 ]! m - <?php
' Q* j; r3 L9 ?" P" _ - $BOMBED = array();
0 Z; Y9 N, ?0 o9 V! X - RecursiveFolder($HOME);
0 e* s+ M3 ]' Z4 _$ h8 U - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';7 ~; @6 c( b( d! d/ Y7 e, e
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
6 s% p" d3 H$ }& R7 b V' ?( {' p8 m - echo '</p>';0 h1 }1 w/ V2 ]7 }; M
- // 递归扫描1 E6 b7 f. @) ^( C2 E: z
- function RecursiveFolder($sHOME) {! d1 x* `. Z9 v4 i; S
- global $BOMBED, $WIN;4 r+ R. B; D4 w$ D6 g; [4 N
- $win32 = ($WIN == 1) ? "\" : "/";2 T; N' B# k2 Z) f, h% J, h
- $folder = dir($sHOME);
/ q+ {* Q) W8 s" |( b$ a - $foundfolders = array();
& J' \) n, i; i$ s' S; x - while ($file = $folder->read()) {0 y/ d$ h S( q- r! s, m6 d. |
- if($file != "." and $file != "..") {
+ d1 R% J& j7 [8 }3 [ - if(filetype($sHOME . $win32 . $file) == "dir"){
3 E! i4 y6 |# V) V8 V - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;0 n u; `" O! i* a# `2 r
- } else {
/ W) I9 m" p, @ - $content = file_get_contents($sHOME . $win32 . $file);
/ n9 G( W( b+ x/ D+ E) y0 @: C - $BOM = SearchBOM($content);
; b/ E5 l! @: n) ?; `* c) C2 ] - if ($BOM) {
' p' {1 A" G0 _/ f - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;* p z" p; x% P0 M
- // 移出BOM信息' v* v" }% p7 Z+ u
- $content = substr($content,3);
- l, V8 [. l+ @$ ~$ c8 J - // 写回到原始文件
^+ q6 Z8 C. x' w- f, I& R - file_put_contents($sHOME . $win32 . $file, $content);0 |* g1 z9 c! c3 {& z) \
- }# j5 ]# ^+ D6 N1 ~9 n. j4 t
- }$ H, W' s4 a; w3 L2 @6 k {2 ^
- }6 m3 J. u! b- y7 {& }/ G
- }5 l" K2 j- x# f- D( Y$ E+ J2 w
- $folder->close();8 E: k+ A4 j0 X% ]& w
- if(count($foundfolders) > 0) {0 [6 h2 |- _% i* p; v) N
- foreach ($foundfolders as $folder) {
' Z+ @- F* A( s! w$ f% ^2 p - RecursiveFolder($folder, $win32);$ O' M* a# G) J: s: f1 ~' \: d
- }
. O0 J* p2 g, _6 f! K: P6 s - }4 {& ~& _! S( s4 ~* Y0 o
- }' ?) u* }9 x T7 P7 T& ]
- // 搜索当前文件是否有BOM& Y4 a+ H$ Z6 f6 @9 q
- function SearchBOM($string) {
1 Q0 J; z6 t, y( e2 a - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;7 W/ O8 r& ^! c" G0 ^* }
- return false;
\. K" b# c9 q. \& Z: V - } [8 g+ a# C2 O/ M5 Z
- ?>: b$ b6 F2 i" O, M8 I+ S
- </body>+ F, M p7 |: o, v! T+ E+ e
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!' { r" T2 f" l! v# N, y4 i
i8 ^* T2 F6 _3 I4 `
|