模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 : v5 K7 V+ O# C' d) e6 k4 O
& A: e1 J) Z" @% ~2 ]5 R: o
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
, C( ^, Y* G7 f3 x7 S
1 F1 s) s/ Z5 s, r C" L4 A它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
& c; V c1 _0 F% e' ]2 o2 \( Z* U
3 g. c0 |4 L+ K- A; q$ \( v t对于一般的文件,这样并不会产生什么麻烦。- g7 P1 l3 f2 h- V5 [' v( [ v# R
1 D. S; ^. ?( a
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。5 n8 P1 h! X4 i1 N" N' D0 L
8 J5 }! d! W8 \/ V' u根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
: ^7 f" A* N* @
( Y, V% V6 h9 {2 L/ y$ c5 }由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
5 i7 A' B4 n) s4 m+ x
# |- G1 i1 v# L u1 {# P6 V直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ! e9 d6 B( J: p1 j8 M, Q: U+ `
7 _% M# \4 W3 @8 Z# b* Z( U, M; y1 r
然而文件比较多,又想偷懒下,使用下列方法来实现。 : S b3 y+ g- Q8 s( D) {5 Z2 q
( d' T+ k$ ], Q7 E r
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" Z- @' _3 [- y- z9 u: a' P# r- R Z* L
9 V" `; E9 k9 ?5 t2 V' L" I
- <?php ! O3 ?% ~4 V$ _/ C& V( O
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 X" Z4 G; Q- a
- $HOME = dirname(__FILE__);
, p" H$ c0 @. |- Z$ f$ { - // 如果是Windows系统,修改为:$WIN = 1;
b$ \/ {4 g2 t1 k - $WIN = 0;
% E$ \5 o: c0 W, k- \! D - ?>
4 M0 E- O( C! n7 Z& k1 L/ V - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">6 h3 p6 P8 j& T
- <html xmlns="http://www.w3.org/1999/xhtml">5 c9 q! x- J! S9 H" \" W. B
- <head>
, o+ D @$ u+ D- C - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9 W& K" S" N2 Q7 d7 m5 G - <title>UTF8 BOM 清除器</title>) H4 h1 v4 q! Z) n& q
- <style>
+ t* u$ H2 A: o3 w - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }- d% ?4 u$ y3 u- N6 {0 I
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }+ @) J2 r% ]! h9 n# [- b
- </style>( I% t7 I- l9 S$ N3 V
- </head>/ J. J# N/ k/ x0 G
- <body>
! G* l# U i! h6 a% k - <?php
% Q/ Z8 T9 a0 m - $BOMBED = array();, ?( q" P) }0 {2 l# O: L' v
- RecursiveFolder($HOME);
/ u: \- h& u6 X# T0 B - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
9 n: Y4 I' u# o! }% {: C3 w - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
3 f. {+ n/ ^8 B+ H! F - echo '</p>';2 B, C0 c0 _ {7 p t! H/ w
- // 递归扫描
; ], P6 B( v; Y* c/ U - function RecursiveFolder($sHOME) {3 @3 {3 H; E+ C3 Y
- global $BOMBED, $WIN;/ v) {8 ^" b. |( o8 {7 v9 @' T. A
- $win32 = ($WIN == 1) ? "\" : "/";
5 N9 p z: h, y/ i+ k ~$ Q* d8 w - $folder = dir($sHOME);4 r! l' @4 O" ^6 U9 h
- $foundfolders = array();" T, G( F2 @3 y2 k0 f! N
- while ($file = $folder->read()) {
4 M$ X' o. o" v+ ^0 v( ` - if($file != "." and $file != "..") {
) L) O1 ?$ ?7 B' v2 q. x$ t - if(filetype($sHOME . $win32 . $file) == "dir"){
# u/ O9 }: Q3 d: I! u9 t8 ~' _4 L - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;1 |% }' Z- _' [+ {3 q
- } else {& @: @' @( w+ T" M. |
- $content = file_get_contents($sHOME . $win32 . $file);8 O; n7 K3 p8 F. n" r @; S
- $BOM = SearchBOM($content);
) `+ b, ?7 y$ A- m* L# B3 F - if ($BOM) {
& P O- E- [, y' J4 e+ L8 e - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
$ q, h! F* k- J" r - // 移出BOM信息
4 p( u o" u$ n - $content = substr($content,3);4 p+ f3 D$ L5 m6 O9 G3 [
- // 写回到原始文件9 w2 l& i) e" S- N7 E
- file_put_contents($sHOME . $win32 . $file, $content);: x) w5 Z$ Z$ | Q9 O4 h
- }
2 S E' a: k' ~% z! o - }
5 |( T& ^7 K6 V, r# e9 l - }" W, s4 x, _' t L
- }- W6 u/ v, e; J/ i! q; X% ~# Y
- $folder->close();
# T s/ b5 y! J0 N! g$ S/ t2 q - if(count($foundfolders) > 0) {0 O: N$ g( G& L( v
- foreach ($foundfolders as $folder) {. d% n5 t) D1 l( m$ W
- RecursiveFolder($folder, $win32);' T9 {! t9 N' q* x9 t! `3 K, O8 u, m
- }" w5 v# Y2 j; A" N1 Y9 \; o
- }- W+ @) S) H! d! V2 I
- }
/ ?8 t% C/ A1 s9 P% M7 U$ ^ - // 搜索当前文件是否有BOM
3 y. i; `5 s2 E; d) M+ K4 `0 Z - function SearchBOM($string) { . K8 f! q; L* W
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
# X5 f/ I# ?9 N# M - return false;
8 r9 n; t. y; r m7 R2 g - }4 g9 w; W2 P1 ?0 Z7 Y( d- r
- ?>
. U# i2 x% p! o' \' n - </body>
; v* p* g4 l, ~! V1 L - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
; K. _+ y2 w- U. K# n
2 D6 g- u/ K! n' ?% m |