模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 + v: Z6 u. \) S! B0 g5 W& w7 P
0 K9 V5 B3 R8 j3 |4 B
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
: a- r- y" j: k8 B8 L8 |2 q; |! g0 M5 B( i8 m
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
, R& M, ?/ C6 t- C+ \/ `; g$ b( |: K# t, q# l/ B6 U$ J; J
对于一般的文件,这样并不会产生什么麻烦。
0 D# U/ V( t1 k' U6 M
# i/ U" G7 Y* k; I) [, [但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
7 i8 @1 P0 O7 y3 [9 k. S9 k: N
3 L* \8 ]$ r4 |9 o1 n根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
9 B% s0 N& [! z" N! H, D
; z& U0 A( {4 u G/ p' P, C由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符! S; L! B( k$ e: x4 s5 |0 t/ f
7 `. m1 L) \$ F! r直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 7 W+ [9 Z; z5 C3 I
- z; X; {8 m) {1 _然而文件比较多,又想偷懒下,使用下列方法来实现。 ! o3 N) `0 V. H
& ~+ Q* R+ s4 ]2 r, }# l; |/ Q将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换; v5 g% K! J. S
3 T I9 a0 i2 {# t8 [5 r! Y" c' B
) u0 _& z2 |) ^- <?php
) I. P [/ A' p) w1 }' J - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
, o l( k5 U, l; X - $HOME = dirname(__FILE__);' z4 o( l) U/ q/ s8 l- H
- // 如果是Windows系统,修改为:$WIN = 1;
3 R1 d( I, e% a7 H7 Q$ | - $WIN = 0;! q, t) M: r2 C
- ?>+ r6 o3 N/ g: U& R3 e' u8 r) [7 @( g
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
. Q3 f( L# u* j1 O$ ` - <html xmlns="http://www.w3.org/1999/xhtml">3 V# l; P) w1 c2 t9 z
- <head>
. n' D, j4 q- _) R) V - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
( p2 K t9 J7 P) l/ [* @ - <title>UTF8 BOM 清除器</title>
. W/ h8 _; P- M* e( M' V6 `1 x - <style>% n9 d' P" o+ i+ q4 ^
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
7 M! H5 v8 k9 m6 b - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }6 I. V) F: q9 ?3 t/ i
- </style>
k: x2 e! Q% h- b+ k - </head>
% p- ?# a' t! e$ V - <body>; w/ w+ _. [: A9 z' |7 Y; G& X9 F
- <?php
. k$ J7 ]' U7 m - $BOMBED = array();
. s9 N+ ~* d3 @* @3 F9 k - RecursiveFolder($HOME);
7 ]4 @$ Z2 k% {% ]4 ~) U& M - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';% J- j7 N5 Y" I( R+ U# s: W
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
( R5 a0 L6 _' O: v' t, g# u# D0 n - echo '</p>';
4 B1 X) X) Q: k9 \+ t8 y3 N - // 递归扫描
b' U- v* ?9 u9 a - function RecursiveFolder($sHOME) {4 W; g+ i' |/ z+ C
- global $BOMBED, $WIN;# S5 C- D& E% F
- $win32 = ($WIN == 1) ? "\" : "/";4 T( {( L* O1 b- J, B; [, H* @
- $folder = dir($sHOME);
@* A6 _; q1 I2 l# S4 c$ Y" i( q - $foundfolders = array();
1 `! e5 n9 E1 Y) {0 q - while ($file = $folder->read()) {! x" T, j1 V9 S, V& Z3 u( y5 z
- if($file != "." and $file != "..") {
$ T! D( h: w2 w% ?& N$ _ - if(filetype($sHOME . $win32 . $file) == "dir"){
, P$ ]; X4 ?4 [3 w% C) ? - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;* P/ a2 f. d5 s* g0 m4 M! |
- } else {
8 T1 Q h0 ^9 ?% { - $content = file_get_contents($sHOME . $win32 . $file);& H+ P; r& t: Z; Q" d& z
- $BOM = SearchBOM($content);
' L* b9 u( x% q2 P* o( g. v - if ($BOM) {8 h; Y4 `) J, I
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
# t! X0 g: n( J - // 移出BOM信息
3 q: R% e+ x! x9 }% [) E - $content = substr($content,3);
! x Q1 }8 a3 t+ z/ _1 \ - // 写回到原始文件$ D0 c d7 A% ]& S; l: e- [8 q( s
- file_put_contents($sHOME . $win32 . $file, $content);2 S9 B7 ]0 Y! W+ g& B. M
- }' h5 O3 L9 V; F8 C+ ^5 X
- }0 K9 F% K: E' V# p1 i
- }
5 s, c$ A4 b v" H - }
t( P! K% }1 y1 u T - $folder->close();
. ^' O" \4 F6 G& S7 R - if(count($foundfolders) > 0) {6 A! N- z6 ?4 U5 h9 t
- foreach ($foundfolders as $folder) {$ ~9 {: g+ Y8 W4 ?: ]& Q) ~2 P$ [: e% k
- RecursiveFolder($folder, $win32);
, E9 \' n. N0 k4 o j: y2 m - }! ]/ B' {: @" o0 y# `* C* z
- }
3 ^8 _" Y- w" _: C& w) J9 Y - }
" k. R4 d9 j! y - // 搜索当前文件是否有BOM
N# d; ?" ?1 \" `- B: D - function SearchBOM($string) {
2 T* }( q1 ], E1 ~ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;, Y; d- S% S, Q, M0 o
- return false; [# l4 m4 Z1 A
- }
+ `1 j3 `- T* Q. \ - ?>
4 J. N+ Y1 [3 G3 O. m9 d - </body>
, V: F1 i2 V \ - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!0 e2 d1 T0 J+ A8 L6 z
4 Y0 V: n4 s1 C1 I) r+ T4 s
|