模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
+ l& `. P3 p: Q z; ? c4 E3 ~) I& p' X" V7 `
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: y& F3 F# s! r) |1 M! J' V6 s
* k9 O& e. _! \, w6 z它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
. {/ j. @1 E* e+ w0 J5 R, b7 ?# e7 r4 Y
对于一般的文件,这样并不会产生什么麻烦。
( {6 `( C5 p' D5 e. V5 |/ @; z2 J" v" F6 L0 F2 s% m
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。 e* i) d% Q- v" d! U# P+ G7 b
/ e: m/ w8 a- y* a% F根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
& k2 {% ^8 G- y2 y
) c' b% Z3 X! }$ R由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
; v% ]6 D; r% F- d% @6 U- Q9 X4 b3 } ]( s$ H7 b
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
" p( P$ \ o A. X/ S& L. Z" |
9 B) F' r+ A3 Q& O7 i( J) ?2 r然而文件比较多,又想偷懒下,使用下列方法来实现。
4 @7 F; m! G: r/ X* P8 r& ?$ @2 ?( G6 d! e
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
6 Y! |. [& R& A _
- a4 x6 o" ^$ Z3 k6 N- x7 G0 z4 ?! I' D
- <?php
- ~& a4 s y) R0 C# x. U" H- z - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
6 B. ~% e' D3 p) {9 x - $HOME = dirname(__FILE__);
$ f2 d7 k/ g, n/ N5 A - // 如果是Windows系统,修改为:$WIN = 1;
6 B1 {1 q" U2 ]3 r, N - $WIN = 0;
F* e5 a% v/ o: N3 ?$ M# X - ?>
x5 Q8 h2 h$ u8 L8 A - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
9 m4 K- K3 m, J2 N# X9 N! ? - <html xmlns="http://www.w3.org/1999/xhtml">
4 P8 E0 _/ U+ r - <head>
: A+ `3 o4 |5 {1 v$ `% ]* E - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9 i9 T& r6 |4 u4 ]& l - <title>UTF8 BOM 清除器</title>
) x# c8 c0 P+ H" f3 [1 G+ C - <style> T3 A* T; Q* f0 a
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
7 c2 g; j. Q! @( _; I - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
' Q, f$ H+ z6 T0 M% Y* [) | - </style>: u8 e) q0 ~* i$ v* [
- </head>
, w9 f3 ]* B. ~3 z' f3 r - <body>0 @2 T/ s# _0 H* S7 p0 }( P
- <?php5 F! }+ O% S) B- c
- $BOMBED = array();
7 c6 \ _6 F3 Z6 P( r- v - RecursiveFolder($HOME);- e y5 x9 j r3 h' I
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
9 s' a7 U/ P0 {# o$ H) ?5 I ]( z4 a - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
% O/ a8 K8 G1 `, R1 |$ ` - echo '</p>';
- N: I: h- f3 A" e( h$ ` - // 递归扫描
" e) ~6 ~6 t. D) S3 F/ o - function RecursiveFolder($sHOME) {
- h+ J6 g+ |, _ - global $BOMBED, $WIN;
5 q' d/ \# x# u6 g - $win32 = ($WIN == 1) ? "\" : "/";
% I* q6 z. P# P1 o - $folder = dir($sHOME); H; s( s7 f% C ]& t
- $foundfolders = array();4 F" z- q9 s6 Y
- while ($file = $folder->read()) {
4 u1 a" O6 S% B7 n- ]; n& H+ k0 m - if($file != "." and $file != "..") {2 v7 s/ l/ ^8 z: h: f3 u' n" a
- if(filetype($sHOME . $win32 . $file) == "dir"){2 o; ^1 H; F' b5 C1 d3 N; U+ _
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;7 q0 j3 g" r5 k# b \
- } else {
4 n4 ~( M6 }! s Y - $content = file_get_contents($sHOME . $win32 . $file);4 P( I1 h) T' [& Y6 }, I$ y
- $BOM = SearchBOM($content);# ]' A; A! p4 d
- if ($BOM) {
& z* m2 }! M! J+ q# w6 Y - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
. E* S3 Y% D7 r! u. j% g - // 移出BOM信息
% a5 k6 [' v+ N7 i6 f - $content = substr($content,3);) k' x& E% o7 l y- S( ~
- // 写回到原始文件
# }3 D0 L. p. A: w - file_put_contents($sHOME . $win32 . $file, $content);% Y$ L# a1 [$ R) y! S6 O6 ]
- }$ l. g C- [3 z: `6 U' L
- }/ W. }* L, l$ F3 g( s5 q, d
- }% ?) ^" M: k* D
- }
0 L8 L7 f2 o1 t - $folder->close();
+ [9 k5 x' f$ ^/ h - if(count($foundfolders) > 0) {: z# L [0 C9 D. g1 o
- foreach ($foundfolders as $folder) {
|5 u2 O- }+ r/ Y7 S - RecursiveFolder($folder, $win32);
" h; t4 J" g6 C. T - }
; C% y& z- u: ]' o5 u - }
' O' Z& y$ J) D" @ - }
4 V* z7 t* G. L( {, n% O - // 搜索当前文件是否有BOM
- T! a. @# K$ z! P. I - function SearchBOM($string) {
% n* z) B/ _+ H8 y" i& M7 W, w - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;. ]4 I3 h. {$ O- a
- return false; 7 x e4 s$ V2 u
- }
% d; n- v! h9 J( Z4 ~/ m6 j; A) S - ?>
3 A O& R6 {# `) @' ^3 H/ }* t - </body>6 W/ K! O6 t+ Q/ o" n' T. u, A7 b
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!- q- p1 j# L: G/ C5 {" u
. I. K* i0 s# Y: {' N
|