模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 6 N1 s; e. \ ]
& N0 y) N# y. E& k# T) D这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
8 V4 d5 H) J9 p$ r4 J; d g9 C
5 \; y2 R! F( [8 @. X; h( s2 e它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
8 Q% h9 Y8 a* O* W* i# B
1 J8 o' J7 n, D" }# `$ a4 p' S对于一般的文件,这样并不会产生什么麻烦。* R. w2 c+ c9 j+ _
: y; w3 A% q/ w ~7 ?
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。+ e7 J+ H1 `1 p5 Z3 t
3 F: c) k+ u% z+ A# e% N
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。% d+ L4 |$ _4 ?& Z: G4 ^
; H$ X5 X2 W1 _% O g由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!9 n7 h* t* t E( V) _
3 T3 C4 }9 r6 `4 K. I( \$ N6 C
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
4 p; x7 s( z, b
$ m7 b5 m: W: `/ F; E5 X* m4 B然而文件比较多,又想偷懒下,使用下列方法来实现。
! p2 O7 T# |: U! c. q
& H. H: j# D0 g8 |: K- Y/ \! i将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换( D, F% N! [0 I4 w( ]
; G1 S: u. a) M1 u
) t+ a: p& q+ b6 @8 [" ^- <?php
; {- |3 I# ?- ~+ W, {9 p - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
3 p3 e: G3 s: W5 K% B - $HOME = dirname(__FILE__);8 v) P' U9 i- H) Z
- // 如果是Windows系统,修改为:$WIN = 1; c$ |' B$ f6 X, `
- $WIN = 0;1 Z/ D' t5 E5 W4 t$ v6 A
- ?>
8 g' g* N! `7 w f - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4 C% g4 `$ y( h$ k V* N$ V - <html xmlns="http://www.w3.org/1999/xhtml">
8 I* F. F% u3 c9 O0 Q7 m: y$ u - <head>, Z9 I2 e/ g3 ?! y3 |+ _
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
: Y+ x! D! c( \& f5 Z7 B/ \ - <title>UTF8 BOM 清除器</title>
; }# ?& ~! a. D2 q j( V* Y - <style>/ W2 \5 `, }& V" \8 K" P
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
% G& Z* D8 y% |% h8 l- X - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 F" V! E0 d( y: V4 \
- </style>( f; I. f( ?& I# t2 |
- </head>) e( E9 d) B4 ~' I
- <body>4 u& H7 d+ P8 u+ N4 {* U& L! Z& U
- <?php
" ~' e0 n3 |9 C, k F( N - $BOMBED = array();+ r6 R+ Q3 i K) `" G' w3 n
- RecursiveFolder($HOME);1 W. y# y# E1 h$ p3 A3 _, \
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
9 n. w; O# ?# _" e/ E$ D: m - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
; U, t. {/ h! w! m2 {* C6 \/ _1 { - echo '</p>';
' q( g @' ?. y' r9 V - // 递归扫描
. G/ a4 j8 t- j: Z8 Y; p8 ^ - function RecursiveFolder($sHOME) {) J8 C/ K% v E5 J2 {
- global $BOMBED, $WIN;3 v' T# m* T. a
- $win32 = ($WIN == 1) ? "\" : "/";5 R5 ]( T7 a7 q- q5 X( W
- $folder = dir($sHOME);
- Z) s+ R: m# y3 f3 ?; G - $foundfolders = array();
0 h4 R+ B' _6 o9 [% g1 e3 J h9 \& \ - while ($file = $folder->read()) {
e. I3 P4 M$ D1 G( j, K - if($file != "." and $file != "..") {3 f3 g& o/ U2 \; i$ [! J% \( k
- if(filetype($sHOME . $win32 . $file) == "dir"){ b8 v: }# u, u: v# D1 @ y* t
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;. T% D2 @$ x# r7 T! V) R& W
- } else {& K+ s8 w3 N1 Y! l
- $content = file_get_contents($sHOME . $win32 . $file);* f& {# L2 i0 v- t% x. \$ N$ i% O# i
- $BOM = SearchBOM($content);
; [/ o, B" C7 j+ A( S1 s - if ($BOM) {
1 r/ V; _5 I2 ? - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;/ ?" [4 h* a; m6 l
- // 移出BOM信息
: }& X% ] K' U& h - $content = substr($content,3);
P# Y1 ~/ p8 S7 ?! ]/ t _ - // 写回到原始文件
8 O+ r2 ~1 {9 i - file_put_contents($sHOME . $win32 . $file, $content);
7 V( N" C3 l2 k! J - }. Z1 d! ~% i6 M: @; G, B
- }9 N$ W- C. R2 d s& k
- }3 O: X0 q5 y: H9 ?+ ~
- }
8 q. y. ]4 K! O+ O2 ?8 | - $folder->close();
" _0 F, t; L; O3 d$ } - if(count($foundfolders) > 0) {. S+ u& e; D" g! O/ Y
- foreach ($foundfolders as $folder) {
# z& @' W' I1 a8 S3 Q0 D9 F% T - RecursiveFolder($folder, $win32);
8 Y! `. A. M' U0 r - }: R- u6 k& A+ ?3 v2 f, D; S
- }
2 d4 q: W0 |# h, f - }
4 S) W. x! V+ I3 T/ J - // 搜索当前文件是否有BOM
' E% b7 K/ y0 m) U9 w; f( @ - function SearchBOM($string) { . W0 K. ] ]6 f4 }6 N0 `' M# d
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 z7 B. S3 S, U8 @ b
- return false; 9 }% M* q4 e: `% c0 C+ q
- }' }% Y0 E6 M) s4 Q1 c2 d. i2 H6 B
- ?>
/ V$ ?* P ^8 ^/ ]+ }5 G - </body> e" y# l) z! t+ O6 O
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
% [, k( }" T& a, K" L2 G e" K9 G% O& f. F [) u4 B
|