模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 ; o; f0 e: q! w T; y
0 F% S5 I7 N: O- V0 T
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。1 T; m; D9 }! x
0 X7 ]0 P- [# c! t: k
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。" a+ U* l' w8 Z9 n5 N, G: b
9 ^0 z6 v- J0 |- l2 L" Y对于一般的文件,这样并不会产生什么麻烦。
( ^0 H9 A) O+ u/ y( G1 U7 c1 F x$ Y( Y, \
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
; o) Q9 t4 U a5 U0 Y# n `+ z( N7 ]' l/ q4 s+ c" A: J" z
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。8 s' P/ `& g; b# X2 m
7 Q9 d' }3 F9 @* `" e# y8 F由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
* R2 A# v. B2 z$ J6 b
2 q3 V4 f2 p, w5 x0 r$ [% t* L直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) + n7 \2 F6 k0 o) K s3 Q, U
" t- V# b7 N6 f( v x- `' H7 O! z然而文件比较多,又想偷懒下,使用下列方法来实现。
* Z4 {. P% }9 P# v# T! u c) K4 B* W }1 `, x) L* w! h8 h
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
! C" J q0 u P) l* M: y! f+ }0 l* O+ w& C }" T
) i1 `. u! N! G1 ^
- <?php
7 B: J, L8 Q" Q- E } s) i - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
1 E& F1 d8 b% A1 b) k n6 t% d8 z - $HOME = dirname(__FILE__);7 |* y4 l V4 B' b% L- G
- // 如果是Windows系统,修改为:$WIN = 1;7 ~) z* f6 `) N6 z, z8 z& t
- $WIN = 0;
4 }1 U" j' \& T0 V! V# I9 A4 c - ?>
( `# a# K! ~3 I; ?7 c4 w/ s - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 o' _; {& ~9 v# A* n - <html xmlns="http://www.w3.org/1999/xhtml">0 `# w/ b9 Q7 b4 S0 L
- <head>' g [/ i) `* d
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
) y+ R8 f) ]/ E& N: b- Y( ^, { - <title>UTF8 BOM 清除器</title>
u$ z6 d% ^7 R* g; l. G! X - <style>6 T* u2 d4 ?+ c- R
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }4 `1 K0 V+ ]5 M& u; @
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
' ~, \/ N' B6 `# E! x - </style>
0 Y! p6 l& [$ U0 S \ - </head>
; {* ]0 ^$ L# U5 G2 z - <body>
8 L# T0 B# E, u- [& X - <?php
( j+ y9 c1 o% s+ B# J2 Q5 \ - $BOMBED = array();8 `& L4 Q, f3 u' B, T L& k9 K
- RecursiveFolder($HOME);
$ S u5 D4 o& T/ i8 K7 B9 d7 h - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';9 U6 [! t8 } t6 t
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 u7 D8 A3 p0 H5 J( e7 Z2 L1 P/ M
- echo '</p>';+ Y. F+ \6 |+ _7 H. @) V! p
- // 递归扫描
( y3 d; a* \6 x) C9 J4 _7 ~4 S - function RecursiveFolder($sHOME) {6 x s" ^: g3 u* @% j* y
- global $BOMBED, $WIN;2 v) u9 n8 C) Q. n. _
- $win32 = ($WIN == 1) ? "\" : "/";* o; Y9 V, j$ o6 q# U
- $folder = dir($sHOME);
6 O& _7 Y: Q: T! z8 d- @ - $foundfolders = array();1 h; R7 G, z, h( C
- while ($file = $folder->read()) { ]9 Y$ \) i# q" B$ q; H; j2 D
- if($file != "." and $file != "..") {& f! o: I. Z* g6 Y$ Y, i6 _+ B
- if(filetype($sHOME . $win32 . $file) == "dir"){
) E1 W, t' H, s, Z+ ~& W/ q - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;# k5 v* j x' @& r9 T+ `+ C
- } else {' H( c, x* J/ K1 ]; {
- $content = file_get_contents($sHOME . $win32 . $file);
) a( w ^" K0 H3 g$ e9 l. |+ e - $BOM = SearchBOM($content);
% d1 N9 b; o" V - if ($BOM) {$ i* B0 o. e) h( f3 M* o% [
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;) B. K1 S+ Y. p5 e/ h* t( W
- // 移出BOM信息
% T# R0 B2 |, e* x1 M - $content = substr($content,3);
( ]; x/ ~7 t' O( T( s4 T - // 写回到原始文件
* k9 Y" }: I( s3 b' m - file_put_contents($sHOME . $win32 . $file, $content);
' g' G/ \$ y& T& k1 q8 T9 |" K2 A - }* R7 Q5 z1 ~3 g! o# O0 J
- }6 I3 c/ l, e+ X5 k* a- {
- }0 D! \+ E6 h$ ?0 N; ]5 A
- }
* t& n+ c) f0 \ - $folder->close();( {* U7 B' O" o2 x X; M% } Z& i1 {
- if(count($foundfolders) > 0) {
Y, F( V7 \; t6 M( k: o' i- c - foreach ($foundfolders as $folder) { v! N3 R. }$ B$ `* W. Z
- RecursiveFolder($folder, $win32);
- s* G5 \4 m/ t4 E6 | J - }: H3 \" v3 @+ j% K" `6 F# F
- }
* i. A- I! |! S% I5 I4 r/ m - }& a K" T8 Z3 w7 t! b
- // 搜索当前文件是否有BOM1 x5 A1 Q% G/ Z' M8 |
- function SearchBOM($string) {
# C0 B- Z- w% U# W8 S/ N$ N9 K$ \ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
" V, |* K* J" o- f- T- G# N - return false; 3 o4 H9 i6 A" u, Q
- }
! r' o0 e! u7 _% `4 h+ U0 k - ?>
# f1 H \4 x% |7 j - </body>
' R$ g; F3 @. W* q - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!% B* O" C# g/ b% \7 j# a
0 N" z/ ~9 _' h2 H3 l1 M8 K
|