模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 % S$ u B- V6 ?, k
3 o3 m# F1 N- ?$ i* h这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。5 L# D u6 f0 t" c
7 D; `- z" C; A+ ^% c; v4 m
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。/ ]2 r( j$ l2 e$ e% `7 g7 t
5 X) Y9 U5 O( ]$ x# E- x6 ^
对于一般的文件,这样并不会产生什么麻烦。9 P. X+ a9 z% ^: C2 m3 X2 U ^
; _% ]1 P$ P2 [' p) K7 g
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
/ Y, h; Y3 L* C- d, ^5 P2 b/ w5 E4 _2 Y, h, ?, m
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
, m9 b4 c- v, p1 _
3 V- ` M2 X; a* H, ~, G, J0 `由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
7 Q5 {, s5 [$ C/ q6 a' z# t
% x. F' E' ]. S% @" P* s. U$ O直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ( Y7 n6 k% c' C7 U- }8 c
$ j7 s1 g5 A- v- G, N+ h( x( z
然而文件比较多,又想偷懒下,使用下列方法来实现。
9 `" x& W: ]* f r% ] x: B. H& [1 N& T9 |; Y6 g( f
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# y9 q& K4 E* }5 L- h& q- \( @( f' A1 U8 E$ q v
% J6 X: x F( p
- <?php 7 |- t$ X7 R' \
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件); z4 y# m5 S% G& B! v+ T5 k& o; T
- $HOME = dirname(__FILE__);" l5 x% u* @1 Y( b5 K* [
- // 如果是Windows系统,修改为:$WIN = 1;
; H5 g) I" z. ~8 @3 c+ {) d2 K - $WIN = 0;; r( _: v1 ]5 T( G4 _: J" _8 f2 f
- ?>6 e8 e4 N: U2 H! T; D# _, r2 j
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">1 v4 B' p& A) M3 ], O A
- <html xmlns="http://www.w3.org/1999/xhtml">7 [$ o* I' J& F; X/ P* [2 j/ Y
- <head>7 b/ |7 g) Q/ V1 a3 k
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />* P$ I2 a1 q5 D& d! o+ R
- <title>UTF8 BOM 清除器</title>
' u# m7 e; o F- a0 ]3 O" s - <style>9 a) f* I J8 D+ o* D
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
6 S @) o, |% Q - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }1 ?0 G( @0 `5 P" d
- </style>( G. u0 w- R* Y5 O; m. k8 d
- </head>0 w6 k& [ U# b: v
- <body>+ r4 g0 O8 D2 o/ K* T& G6 [3 ^9 ]
- <?php% ?+ P, A" |6 t, ]" n1 W) J
- $BOMBED = array();
" S9 K$ Y; z0 {7 H' D - RecursiveFolder($HOME);
/ ]* m5 R8 Y9 r( k+ ^ - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';9 y1 V6 |& Q9 K3 t& |
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }* f% T, {" c2 `
- echo '</p>';
( ^- g5 u" p# O& J( S - // 递归扫描6 H4 N& q+ e) p$ i- w% A: M
- function RecursiveFolder($sHOME) {
; u! r8 H' K) w - global $BOMBED, $WIN;
! W( l5 X+ m* N' }6 G/ V# c5 p - $win32 = ($WIN == 1) ? "\" : "/";
) Y; d% Z) _. `; x5 r - $folder = dir($sHOME);, n2 v5 v5 j' ~3 ]5 n( {! c( F* C4 Y6 C
- $foundfolders = array();5 I) z8 z2 X9 q, A$ ~9 c
- while ($file = $folder->read()) {& y- ]7 T5 e( f
- if($file != "." and $file != "..") {
( q- k; v/ |( j - if(filetype($sHOME . $win32 . $file) == "dir"){
* p$ j' |1 h: j - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;9 i( t2 r& ]+ |" B
- } else {& g% Y# @ e% K, b
- $content = file_get_contents($sHOME . $win32 . $file);
+ o: ]& q' L3 H- g - $BOM = SearchBOM($content);
, u0 C; f9 M' a0 v, p4 Z - if ($BOM) {
% y5 o* J F+ G1 c* e% `3 V% E# M - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;! d) M3 n8 c- K1 B3 O# y
- // 移出BOM信息
4 _& c) _" ^. X- ^3 a! [! p# q" ? - $content = substr($content,3);
; {: c E: O! F' v - // 写回到原始文件. |9 q9 y5 k- }$ }, ~
- file_put_contents($sHOME . $win32 . $file, $content);8 n r8 E* J, ~# O9 g' U, b
- }
9 ~# C0 J' y" Q, j" c+ X0 k; N - }
( I# S+ ^) q2 E - }
" g1 a7 c. X1 _2 K - }' ~: L" B+ R- P* t
- $folder->close();
, T! O, p2 c/ H& u - if(count($foundfolders) > 0) {
4 A$ a, j2 E _$ F/ A% ` ^ - foreach ($foundfolders as $folder) {
4 k; `4 x& l, d( k4 W o0 o% ~ - RecursiveFolder($folder, $win32);
) F$ ^8 t+ B2 }. u1 Q - }
; r% A# |% O, l& q- V, G% S - }
" Q! g, \7 O0 J. }( W* U - }! u. f7 w# A6 M) N
- // 搜索当前文件是否有BOM; N- c7 \# j' k$ ^5 X- U3 \
- function SearchBOM($string) { : | ]+ G" ^ ~& L4 ~8 I# ?( \
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;5 s7 q0 u4 ^5 u- R5 k9 i2 p
- return false; % n) x6 k5 b y; Y) f
- }3 s* C1 i0 _, t
- ?>
' O; A1 H# Y' F2 c$ T+ `9 j! w M4 ~+ ^ - </body>
7 E" _% @6 Q1 K; S( a1 F; Q - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
* r: B" X+ B |9 |
: b2 G% s" G4 O- r% B2 ^ |