模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 8 k$ X4 u0 ?0 s+ y" W4 i
w6 ]7 M) U- O/ D' i* X1 F) F/ ]. M这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
8 p! }1 A9 W6 s4 N
+ h, p/ b/ v4 z5 b( s它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
* u/ X! F$ Q( h0 X
9 L7 @* a# i1 j2 T& H1 s; K对于一般的文件,这样并不会产生什么麻烦。- h1 _. t- V) Y) n. g* T. r" P
7 Q" p t! k' i( K& ?但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。" r. e @4 X* G2 o2 f Y
1 H& A$ ~# n; o( P. Z根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。, I* p% q1 x4 r
+ ] @4 F0 M' ^7 L2 L& ~; ]
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
# a7 @! W/ Y7 I2 m& ^! _0 |" j! p2 t; R6 r
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
/ @1 [8 O! p6 H/ x
: a7 j6 e) g4 g5 ]然而文件比较多,又想偷懒下,使用下列方法来实现。 1 Y$ w& D1 C, l, T
# m( p8 `+ u, o' s4 I; @将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
; g ^4 R1 U4 ^! g/ r5 ^# T$ L q$ V6 T! u% X0 J8 O$ ^7 V
! G4 y/ z' L+ b- O3 |; M' T
- <?php
: N6 d9 r* s8 ~ - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
3 {. R4 p: H( P a% R3 Z8 `! ^/ c - $HOME = dirname(__FILE__);0 R( U$ Z# \ \$ |3 D+ @
- // 如果是Windows系统,修改为:$WIN = 1;
' }) Q5 T) s7 m% B, P/ R" x - $WIN = 0;0 R9 p3 n& X. t$ r' t
- ?>" y+ y. L5 s0 |$ }
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
' t K" g( W) K1 d0 {* [9 ~ - <html xmlns="http://www.w3.org/1999/xhtml">
, F# A E( x7 p! e& N - <head>
+ A3 O' ^) m# d, b) a- v( _/ { - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />% O Q' q/ B5 }7 |- t. {
- <title>UTF8 BOM 清除器</title>
' z* d5 y6 a1 T4 h# G; p4 s$ [ - <style>
6 u* E4 [ I2 y0 `" j - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
( _* m: G/ D$ s" L. r0 X6 N - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }# w! f/ @( j+ e* g, ^) s% Q
- </style>: e2 S/ a; A. Z8 L# r
- </head>' ?3 A0 Q* R% I, I J& S3 a
- <body>& M% Q1 b6 F8 ^5 R& l" }! z, t7 M& k
- <?php) ^% G! K* p- S! O& K- a9 h0 d7 P
- $BOMBED = array();) ^2 t" b( n1 B- ~
- RecursiveFolder($HOME);
7 t+ h5 w. P" M/ z - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
! R: I3 p* {5 R- H7 K9 j9 E - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }- A. k% Z4 x$ ]+ B, P- f
- echo '</p>';
5 _, {: M C5 G% g- M - // 递归扫描
+ g# i ]7 G$ ~8 N$ G r% k, Q - function RecursiveFolder($sHOME) {
2 e6 o9 W) L% K4 f# x& M) u6 N7 o - global $BOMBED, $WIN;
# K, ~. q+ S) | - $win32 = ($WIN == 1) ? "\" : "/";, R6 r* f. x! c1 X3 a, ]
- $folder = dir($sHOME);( g5 c |( T5 d5 C9 Y: [$ h
- $foundfolders = array();
4 Q; ~! k" s5 d% L9 _ - while ($file = $folder->read()) {
) c( F* d: \1 b( c1 s/ \ - if($file != "." and $file != "..") {
2 P5 W% @9 d: [ - if(filetype($sHOME . $win32 . $file) == "dir"){
8 F0 t4 o- ?! H# s - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
% y1 d8 N+ y. N3 H% r4 z - } else {. U% k. k9 s1 j& B- r
- $content = file_get_contents($sHOME . $win32 . $file);5 d8 b. _% q$ z% G, F
- $BOM = SearchBOM($content);
( M' |- R* }! l- i0 B8 n, H3 A - if ($BOM) {" E; }- c# u" H! k0 L: J) l2 j" a9 d) j
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
/ @. I; k6 O4 v+ [: Y! y - // 移出BOM信息0 L3 q. T1 U S5 H. H6 A/ ]
- $content = substr($content,3);
9 n* C: g+ K( H& i! ~% s - // 写回到原始文件
$ @. M1 a: m1 ~7 v+ S! c - file_put_contents($sHOME . $win32 . $file, $content);
$ b. u8 ? ? b# | - }
: q( Q# @7 x" K( T: W - }
; k4 z+ Q* y! f - }4 f4 V6 `3 A$ V, }$ [7 _2 U
- }+ y- R# `1 i5 m) _& Q
- $folder->close();' K* N j% I+ L- x$ \$ Y4 B0 o( E( r# z
- if(count($foundfolders) > 0) {
: c; N9 r6 \" u* H% E7 s; s7 ` - foreach ($foundfolders as $folder) {0 T8 D% a, o/ G% z& n2 o! d2 X; ?
- RecursiveFolder($folder, $win32);
# U# m' m. A. F$ F0 M# i - }
# B9 H3 ^ c5 L - }
( h4 r+ ~( `( n* C+ A, _$ ]) L - }# `* j5 o$ ]$ E; |8 I9 |% p5 s
- // 搜索当前文件是否有BOM3 A3 X7 p x8 l; M% L/ i
- function SearchBOM($string) {
4 u5 O1 r- _- O$ M - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
5 p) U( R0 A2 A) U' u' B - return false;
, E2 b, B6 Z, ]/ j# } - }9 `4 i% f6 F5 W- f
- ?>
- i" G. M& M9 J- f - </body> M. N, j( r; l/ D- N, L: l0 T
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
3 W8 @1 Z& t7 K0 ^: J) G2 g0 U0 y" }, v. A! W r' C" g
|