模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
5 ~! j+ M2 ?, W' R7 ^: n5 |2 j- F% M
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
) i7 Q/ _+ [! s! \/ {
! U& v6 ^; A7 N+ z; A它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。0 H3 q! o$ l) e# ]- @$ ~8 e2 D, r
4 ?. ~' o T* X7 x6 x( D2 i
对于一般的文件,这样并不会产生什么麻烦。
1 z6 H' c# o- t' V: g, Q) x3 O
' e) b9 s! h" t4 A/ @, I7 m但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
/ o" H3 W. z6 Z g/ H# g8 n' N T+ \2 i. x8 }4 v b
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。( Q8 }4 [1 m* K. T" ]# O5 L
0 k/ z- n8 T8 K. | R/ h Z& r由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
/ d, p# O9 o1 J8 P2 { f. z: F' Z3 V6 B; J, I6 f' z p- G0 i
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
! k# V ~* v/ t+ F6 V0 @. _9 V) E
然而文件比较多,又想偷懒下,使用下列方法来实现。 % a3 V# B9 X6 a4 [9 H. X
4 H7 o+ G( Y) N3 Y) S1 r( b" o
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" a" B: c, m' d% l0 r! f8 B0 {5 _. r, U( V/ U6 F- q5 f
. [! U' Z4 j$ p7 E7 T0 U0 C- <?php
3 F; b+ i" J, e: V2 D - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)/ i' M' ?! \% ?) M
- $HOME = dirname(__FILE__);
/ F0 Y- |6 j; H3 r - // 如果是Windows系统,修改为:$WIN = 1;8 b$ W: h! Q' A# B! E- |: \
- $WIN = 0;
8 h3 W0 I* A* P* G U& c/ ` - ?>
) ~% t) v' [- z - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">& Q9 q! S6 P- z
- <html xmlns="http://www.w3.org/1999/xhtml">
( `1 h2 b& \: ?: C Q( ^1 R - <head>2 W* [7 E- ?! J! j+ ?
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />4 a8 g2 v, j3 _: j3 ~( y4 z
- <title>UTF8 BOM 清除器</title>
; f0 y' d; v& r$ ~! g - <style>7 ~/ X! Z; x8 r5 `! V+ h& s
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }( {* Y& @* Z# T$ k" s
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }. K" A) Q1 L7 T- B) F% |
- </style>+ b$ \. p9 u# e2 S) K/ L
- </head>
# _' @4 i6 {/ ]- W* b* j - <body>
6 V8 L6 X Z; x3 \ - <?php
5 z4 G7 V# g J; @/ ^2 v - $BOMBED = array();. B4 T2 F- v. s* ^9 O
- RecursiveFolder($HOME);) O& Y( D1 Z& w& C( h. [6 }
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';" a) ]9 J" L f% V4 D( ^: V( P4 O
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
" l0 v! W* ]: K5 T0 ~) T( V; ^ - echo '</p>';
: a5 R9 Q u$ O3 v - // 递归扫描: L0 j; A4 F/ s( z/ w: Z8 O
- function RecursiveFolder($sHOME) {9 x: y# a. [( q6 `9 ?
- global $BOMBED, $WIN;0 |: v4 t _/ e
- $win32 = ($WIN == 1) ? "\" : "/";
: b1 A4 x( W5 G" g6 y$ y( Z - $folder = dir($sHOME);4 O- J$ Q- O2 n+ l/ l; ?/ ~+ A
- $foundfolders = array();6 h4 ~( L9 `, s, `1 V" _: W
- while ($file = $folder->read()) {
! _6 u( D! j; b: K - if($file != "." and $file != "..") {8 b8 I$ h0 |. C, ~$ V6 a$ D0 P
- if(filetype($sHOME . $win32 . $file) == "dir"){
& b) A% K7 ^+ W M0 j - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;* I* J7 S& x% L4 I, z
- } else {- R6 S k: l9 k
- $content = file_get_contents($sHOME . $win32 . $file);3 Z6 `/ v+ Z; [. c- q
- $BOM = SearchBOM($content);
* P$ |6 x0 u! p" m# ~ - if ($BOM) {
( n6 G/ E. {. r9 e2 L; | - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
" _! h$ h k+ t# F# @# X - // 移出BOM信息
# C% g8 d& @+ Q V9 o - $content = substr($content,3);2 s0 T6 |# ^/ c% Z: A
- // 写回到原始文件( r+ r: n! D2 W' g8 V- e1 j8 T0 U
- file_put_contents($sHOME . $win32 . $file, $content);2 y4 L+ o' S1 r2 ~4 M
- }, A- s$ Q1 }6 I
- }
; u8 [# q5 }( C( s, S4 N- H - }! [. A( p7 R) y) _; u
- }3 K) [( s" T6 A; B' k, p
- $folder->close();+ ^" |1 K! x) Z9 M
- if(count($foundfolders) > 0) {3 q. T1 C! u6 h) w
- foreach ($foundfolders as $folder) {
) l$ [! i8 V9 J& n% g( F2 g1 @ - RecursiveFolder($folder, $win32);
; l M* s7 J3 s% A' @. Z - }
' A8 e8 V" i: {6 W: n2 y- C) e - }
& k$ P* k+ P' p - }+ a* f! ^% `# i% b, a- F
- // 搜索当前文件是否有BOM# n+ Z' i( D9 f& z* s$ ?
- function SearchBOM($string) { & U( X# F6 g- x2 i/ _
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
) j5 D0 G7 |4 p* X4 M2 f$ T - return false;
2 C5 v/ `4 Q8 M# G. |$ H1 r8 l% b: M - }
9 a: z [- H4 A6 Q% D - ?>& S' @( N% r+ P; e! l0 ]8 H
- </body>
* W" r! [8 p. h$ d& } - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
0 Z" H2 c. ?4 z& N) Z8 s$ d' z( {4 Z1 X) Q# k6 p* {
|