模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
% E n1 Y+ d; J; u+ @( U
) _# P1 }9 n, M' ?这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
b, H( N7 ?" @+ u. | o% l# ^/ e# E" J# V% j S: g0 q
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。; _& c0 }% K* [" b
; N2 ]5 [) p% w, z对于一般的文件,这样并不会产生什么麻烦。
: j" ~, e5 v, P' I# K0 `
* E+ |8 \! C# Z( T: R' F( O) E但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
* x* {, _* e, }3 P4 r- f: V* ?- }4 `4 J
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
' K( b1 _5 V7 E0 U
* R* U6 X6 J/ v2 M9 r由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!1 q. d" M* _2 b1 J; H6 [3 w4 C
B6 Q2 ^1 |$ Q. ^: T0 W直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
- f' G( D9 X$ N( K3 L% _: H8 r! B9 ?: |2 r" w( V( _+ D
然而文件比较多,又想偷懒下,使用下列方法来实现。
% }7 Z9 ]3 d$ N- Q! J& L- f; o% O1 ?- Y& l. W# }
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换- [+ e# z# x. E! |0 _9 E6 `
- J5 H. z% R. \5 t
' D$ F; k& r/ W9 F& o- <?php 5 `5 Q3 t, @# T# \
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
0 b) t! `6 `% b+ l - $HOME = dirname(__FILE__);
$ b/ D( l/ i1 W, I. x2 T' y8 ` - // 如果是Windows系统,修改为:$WIN = 1;! K3 Q/ g! u7 k( T! b! g$ l' x6 H
- $WIN = 0;
) m7 J/ @ c8 H6 H+ w - ?>
$ a4 z, e: V4 n* [- _& s0 x' c - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ L+ F+ V/ U4 k! b4 ^5 } - <html xmlns="http://www.w3.org/1999/xhtml"># ?/ g5 ^9 k$ y( ~/ s
- <head>
% T8 c. b2 a8 }8 F2 @ - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
# d" l7 }7 F' g; ?6 w - <title>UTF8 BOM 清除器</title># `7 l0 f2 y- X. B/ t
- <style>
4 J5 s! k+ j' f4 c' u - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }; g. T: A1 \6 T2 {4 ~, e8 T8 }
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 i. e2 Z5 h4 o# Y" J' n3 l
- </style>
8 |7 B H/ j) R - </head>
; D9 u8 f" A' Y# ^: A! u - <body>
# X9 b3 I, V+ f5 P% F7 l - <?php+ }# z& `2 A% s W' C6 @# }7 x
- $BOMBED = array();
& O y5 g4 L% G) T# a - RecursiveFolder($HOME);" V. G6 ~& `, g/ n, ~* }
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
0 r1 [& [9 d2 T1 _) y2 p7 X+ z! v# p - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
; j/ {- f( k) c/ I! c - echo '</p>';
5 E& t/ _ v* @: H$ u& R7 p& U% ?6 @ - // 递归扫描2 ^* b9 A- \; }8 c; M. {
- function RecursiveFolder($sHOME) {: P+ M0 E6 H7 y6 X9 @6 F) P4 H( B
- global $BOMBED, $WIN;" t) d+ s( w/ M* F0 d1 ], {
- $win32 = ($WIN == 1) ? "\" : "/";) N5 n7 a) _9 }
- $folder = dir($sHOME);
: D0 S+ S, J& R# y( \; P7 V - $foundfolders = array();
( v* K" e# N5 n. `% }. ? - while ($file = $folder->read()) {( W# T! _9 b( B3 [. @( i
- if($file != "." and $file != "..") {
8 n5 q# c+ [! x) S% X2 k N/ C8 Q: Z - if(filetype($sHOME . $win32 . $file) == "dir"){, l* ?' @3 b4 q: n" ?& }
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
: f1 w" T. [' }# ^9 [ - } else {
# f5 l# M' X& p/ l$ O/ S! [6 c - $content = file_get_contents($sHOME . $win32 . $file); g4 I: `- b" K4 L9 p5 u" H
- $BOM = SearchBOM($content);5 {" T$ F& V, o' b, F
- if ($BOM) {
3 E* k3 C- Z. J7 \7 o. J - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;- E8 U9 p2 o) T( N3 k; N
- // 移出BOM信息
: g8 }2 x4 J2 e3 m! E! V! S5 Y% V% ^ - $content = substr($content,3);
2 t+ L- x, ]7 \ i+ _1 d - // 写回到原始文件+ i; `, d+ |* v2 K! k1 H
- file_put_contents($sHOME . $win32 . $file, $content);- ]3 ` Y0 ]# o. r% V# s6 S
- }* Q+ Q/ l* E$ I; n
- }
& s {& L: G9 b! b! E9 ^3 H# } - }
; l' A. a* J4 B* K q5 D( P) K - }
) H/ i+ Y" W- q4 W" f; e - $folder->close();
9 k/ o, U; [' Z% o" W* O& p; }6 r* x - if(count($foundfolders) > 0) {' ]" R$ D( p/ U; i
- foreach ($foundfolders as $folder) {3 H- N8 R: q8 \2 @5 r
- RecursiveFolder($folder, $win32);6 `$ M! ~6 l" X9 k, h6 Q7 R
- }. [8 [" j b( d. }. d' a
- }
) F2 o- x4 V! y: j O; d) C - }1 }. B; n: y/ O/ ]( D
- // 搜索当前文件是否有BOM) X7 g3 |5 B. r" W7 q% E* j/ h
- function SearchBOM($string) { 1 d8 b- M* Y2 H8 _' i O
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
8 w) X* } F. C7 c2 u& q/ A - return false;
9 S6 e9 P' u3 J7 U4 P& e - }
@$ W2 x* q; b6 ]' S7 ~3 n - ?>
3 R, U% [1 J. p; h4 Y. `' F - </body>
. q/ ]6 J! r8 f$ } - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
C/ j$ e2 ?' q3 C$ b* F6 z" W- `; Q+ k, P+ V' f% z4 f
|