模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
7 q7 r" R* W8 p- u) K7 {6 U+ S. `& ?# M
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
# N0 V: x+ v! V. I, q3 ]; {" p* y2 c" k' j2 {
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。+ q0 G0 _$ A; ?
% f5 p: y& Q, V- ^8 T- V$ Q
对于一般的文件,这样并不会产生什么麻烦。, K8 g! S/ z& F' y/ \ ~+ r0 k
5 b( @) _7 S- ~" x% C
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
, a: l) C4 p& s E' p0 c4 f" K. u) W' e& @3 p$ G* b
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
$ W/ j _3 G; f2 p: F+ R0 v$ j
1 n" s, b1 t, [- C& x4 l) X2 K# ~& k由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
. h% L0 k+ X* ]$ a4 X- {: ]" j( y; L- M1 ^6 Q. W) h
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) / m- B5 d% _/ ?- A1 Q" o
/ _+ s( ]" O* c( e
然而文件比较多,又想偷懒下,使用下列方法来实现。
) g' z. K, H. w7 E# e. i! y
* W2 p/ H" o/ c+ a) Z. g2 I将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换4 n# O! q0 e# `" V' |' R, g
' i' _' d% d& p; K- N
& S4 T( _- [( g/ e5 J- <?php . Q; ]' p( p/ Q; }+ a+ k" J
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)" {/ R+ y3 Q" m: k* x' M% G5 g
- $HOME = dirname(__FILE__);- N# E2 h2 b5 q4 B8 c
- // 如果是Windows系统,修改为:$WIN = 1;3 Q. y1 ]* |* m# W
- $WIN = 0;
6 ?1 ^' J3 i9 D1 M - ?>
r9 q; B4 Y8 s9 R- I. b$ [ - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">3 ]# K3 F0 |) I) i5 j% J
- <html xmlns="http://www.w3.org/1999/xhtml">
5 y% v0 g% M0 ?0 Q3 V5 A - <head>( [% q7 q6 d8 X
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />. K- \6 d$ C n8 N) E8 c
- <title>UTF8 BOM 清除器</title>$ v7 ~6 a' z: ]7 U7 Q
- <style>. h9 ^7 K( q* ?% `7 c
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
8 p: `6 U2 k* D$ r9 z, v - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }! G* M, o/ S' D
- </style>
9 V$ V/ P3 w" C# L c& o0 l* w! e/ a5 A - </head>
. q! p; x1 o* S# m9 o - <body>" K- G9 p% Y8 @ N1 ~4 d, i
- <?php
# l5 P1 _) N% W3 \) H& N+ f - $BOMBED = array();
% a* x2 V( T- o4 @3 T - RecursiveFolder($HOME);
/ w# r9 \* F" [0 D& ?8 G( B$ x - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';0 m7 d0 L9 r$ w! b; B% J, Y$ B
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; } n# z, x1 J; ]
- echo '</p>';4 o( s7 E" ? a; Y
- // 递归扫描 I0 i& j; J2 I
- function RecursiveFolder($sHOME) { {4 {, `7 @5 g6 h* x
- global $BOMBED, $WIN;) _. |3 C* d5 C9 r7 i' v% E- m! L
- $win32 = ($WIN == 1) ? "\" : "/";
( }0 K X: O8 L- ^- `) w1 @ - $folder = dir($sHOME);+ C' O" u2 v$ m8 m7 J" z7 m
- $foundfolders = array();' R, K2 Q' [& h3 ?% Z( t& x& N% [
- while ($file = $folder->read()) {
4 `! y' G& X0 `7 b$ r5 P - if($file != "." and $file != "..") {
- }- A* K; C9 B; I$ a2 d0 P - if(filetype($sHOME . $win32 . $file) == "dir"){ h4 h% G3 ?$ G, C6 T) p1 b
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;. D1 g5 t2 x. Y5 X
- } else {
; n! G) r5 J( w - $content = file_get_contents($sHOME . $win32 . $file);
: G* |+ ]' m8 g8 g! q3 @- A0 } - $BOM = SearchBOM($content);5 C4 K' h K* G" t* n# o
- if ($BOM) {
! h8 c: v8 R: b6 Q# l! U - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;% G- z% _9 v* j8 D; d7 \
- // 移出BOM信息) X1 f, }. x3 N/ {# K/ y* v
- $content = substr($content,3);
' o+ }! t& y/ F, o# c6 a - // 写回到原始文件
! y( r# t) d4 T6 p( Q; O - file_put_contents($sHOME . $win32 . $file, $content);& ~9 P+ A. E' P" _+ [
- }
* C4 ]" b, I y! _1 z0 \! i- n" B - }
- p, {2 K( ^7 I2 x - }
0 s6 y6 D. B$ j2 | - }# I z1 m$ l/ t6 J
- $folder->close();
# {+ ]& x2 i7 F - if(count($foundfolders) > 0) {1 x4 l2 @8 d0 C$ P4 N# W0 g) ~
- foreach ($foundfolders as $folder) {# Q# x1 X! ?4 q6 R& Q$ I0 s7 i
- RecursiveFolder($folder, $win32);
9 @7 ?* Z, }. n - }
2 O8 Z% D u4 K - }
7 }. }' W7 U6 X; w( U - }
7 Q8 W9 S4 Y) T* y$ \7 r& Y6 n5 e- B - // 搜索当前文件是否有BOM1 N7 ~% d& K/ r; P7 K
- function SearchBOM($string) { ( x* z' k ?* Z, Q. W
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
% J( Q, A: `7 T( P/ A - return false;
, H5 I9 H- M6 f7 K, r+ I4 z - }
+ `$ J: L2 k# m2 {" _ - ?>
8 I# Y8 w. G+ n, z9 U! g - </body>
, M1 w( t, P' [$ U* N o* u7 q( V - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
: N& t) Y( S4 R+ W' `. o; k' B) r6 J! d% |6 N
|