模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
% U/ x# E/ b- W2 _. k2 F; I! G4 y1 F+ F- u6 b- q
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: w% V1 Z5 `8 a- C r
1 s/ b* f. w1 p% F. Y1 ^5 \: O5 Q它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ q# q- L. ~4 ]0 I. y8 f5 Z: Y6 K7 t# w* d
对于一般的文件,这样并不会产生什么麻烦。
3 O( `/ [& ^- L& T/ R. l% u! S! r& S) \, x7 a
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
5 d! E" I5 R X! F6 ^! M& H
: i5 ^4 P x. w: D- ?4 L8 n4 \根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。& n$ W4 U4 o# S4 X
0 }5 G6 L5 R3 K4 S% ~# _由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
2 Y, }% U; q; a: `
. R3 B& [/ Z' O( X- T直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
; A G) w5 W7 Z: a+ {. p. l1 R! z6 E- P) a$ ?# ]! m1 d
然而文件比较多,又想偷懒下,使用下列方法来实现。
5 x6 |& S& M0 X: Y/ j8 `( J
, R) F1 v6 d0 e将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换8 g7 y$ ~6 R% Q+ h4 k/ p
' o; H O/ _( b2 M, z
, \( }2 R2 k2 u; ?3 i: c- \ f- <?php
4 R1 {7 p9 i' u7 C# t3 i1 t - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
2 P! M6 J" ~" ~) B' V - $HOME = dirname(__FILE__);
0 e6 j5 W& y9 ?& y# D8 `3 v - // 如果是Windows系统,修改为:$WIN = 1;
, h. r' ?! E7 o2 Y - $WIN = 0;& w, B& M8 m/ P5 ]9 n: N! c. [0 Z8 B& r
- ?>
7 g7 P0 L6 T% Z9 Z! k9 l - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 ]( S+ m6 D! a* B3 N3 ?2 M - <html xmlns="http://www.w3.org/1999/xhtml">$ y0 V+ h# _/ t1 D* x7 K3 F
- <head>
4 P) J* k( g* S/ E3 Z$ @4 y - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />9 y, j; ` {: Z& |7 f
- <title>UTF8 BOM 清除器</title>
0 `4 K( ~$ s. N% I. l- u - <style>3 M9 a5 c- `1 x, Z; G8 ?
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }0 _- P. T* n' ?2 H
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }: B5 Y. d/ G6 [
- </style>
3 u& s: k; E+ h h. W% x - </head>
% E T; W+ I# b: J - <body>4 B# M# h- N! W' p0 B! L: b& _2 ?
- <?php; a3 \" u7 U8 X. w' E; X
- $BOMBED = array();# ^1 a+ l# J$ ~* B( h) P5 Y
- RecursiveFolder($HOME);, S# o( f' m/ O; {5 S# p( A% L
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
, j/ O9 d6 ^3 p+ t U$ Q6 Z - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }$ F5 l$ }" [! F) M4 B
- echo '</p>';
S- {% y1 X# H) l - // 递归扫描# K& t. E" E2 n. a( K1 S
- function RecursiveFolder($sHOME) {
2 S1 d- ]0 _( a- R - global $BOMBED, $WIN;
; R: a6 G$ P( d" Y g. S - $win32 = ($WIN == 1) ? "\" : "/";3 p7 O4 }& @* o# a. E
- $folder = dir($sHOME);6 ?) x- e2 {- L, T4 w# C% \8 x
- $foundfolders = array();
$ I8 I) |; X3 O( e. }& t/ x3 @ - while ($file = $folder->read()) {5 s7 n9 s) n5 ^4 C2 m# G/ ?9 |
- if($file != "." and $file != "..") {
{* _" Q3 f# A7 a6 d - if(filetype($sHOME . $win32 . $file) == "dir"){0 o& Z- M" @3 H' c% v
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;" K" h2 P6 e, _, r
- } else {- J: V* Z. d: }- e+ Y' J
- $content = file_get_contents($sHOME . $win32 . $file);6 ]3 V+ i+ s8 F8 \
- $BOM = SearchBOM($content);: k. U# u3 [( r) Q9 G5 P
- if ($BOM) {
6 i5 m1 C# F- K2 {# F - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;2 q# A e# g& A/ x9 x0 j, ~9 f
- // 移出BOM信息- Q- A& y7 T7 C0 ?' `- A& I
- $content = substr($content,3);* \+ r9 D" O% |$ ~# w
- // 写回到原始文件
! c! l8 v# L1 x1 ]8 { - file_put_contents($sHOME . $win32 . $file, $content);
( p; z- F& L* k$ U, O8 \/ X, F1 L3 } - }
, Y. h: E0 y8 Q4 F3 n* l* X - }; ]* }6 ^5 V" \6 Q' a, G9 A
- }
- a/ j& {. I' l! O, q& U - }
: Q+ P" I" V; ]; x4 h; ] - $folder->close();" M1 f* H3 H8 R+ R, i* z
- if(count($foundfolders) > 0) {0 J0 H- f( o$ S' ]3 x- A
- foreach ($foundfolders as $folder) {6 L: W/ U. J; ~+ g. n4 r2 M0 E
- RecursiveFolder($folder, $win32);% G' c0 i6 }; M% j0 W
- }
) g$ a7 P' y7 k6 N/ x - }# U( P2 p* ^9 B" g& n# c* b6 V- A3 D7 ~
- }
* Z( D6 i% b: N! l1 x! D+ Q1 X - // 搜索当前文件是否有BOM* a2 c4 Y2 s* h
- function SearchBOM($string) {
6 c( g4 _5 x* a" z _ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;; X9 T/ }+ r4 f* C# z, J
- return false;
2 q5 h" F$ s ~3 P1 U - }
% K- s( V8 Z2 P# \3 Y, X6 {- F% [ - ?>' x7 u* y' F; j- y
- </body>7 f9 z. O" k2 _ e: X, t0 }3 |4 u% N( h
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 e, L9 O9 R# C6 w4 H! Z" \# N9 s" _
0 d& T) |" Z* } @- y8 I. y+ e: e, z/ L) A |