模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 " U- J, S0 I0 n& f+ B
+ @8 B! J6 W. M% }& |& I' Y4 Z" u( _, @
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
) h) `$ _- [* f3 L( V! `5 O
3 n* D3 Y3 k. ?1 g1 E它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
& `; P8 B+ O6 I, ?: _7 @3 Q$ Y/ L7 Z2 D: i0 B$ h
对于一般的文件,这样并不会产生什么麻烦。
% j3 _" ]/ }# Y9 X ~4 Q2 V9 K) H
" b% o4 E( x4 H3 m. |. Y但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。; B- b3 W, ~. P+ Y# K7 z
( B3 w6 P1 D2 e6 B- B, k Y& t: z/ {根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。) ?! _. d9 x# r. C4 a6 h# e
; G$ n0 b, Z1 _# t" `& U7 [/ V
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
: A" S9 m$ [( ^& H0 P
3 `: `9 W1 ~4 G" L$ ^1 C直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
8 {. D7 l( g* T0 @5 h, B5 ~9 V! ~! ~9 \) c! p* D9 U/ U
然而文件比较多,又想偷懒下,使用下列方法来实现。
% E; |: I6 M, W$ K/ ?
: @* U7 T4 l" H% X4 K将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
7 v/ @2 q) v# _# |3 `, x
. }7 o! u, U. q$ J! d) t- X; `0 j: E' o) E' y8 F
- <?php % a* _8 h$ j8 }/ H9 d) ~$ N" g2 i
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件), x& _1 q7 }4 L6 k" X* d
- $HOME = dirname(__FILE__);9 |3 `% @2 e" O1 i' d/ ]) ~
- // 如果是Windows系统,修改为:$WIN = 1;
8 Z- m$ r n7 r+ U% Y1 `5 ? - $WIN = 0;
0 v! u6 B; P! G$ u2 A& D: I - ?>
8 Z( P( c/ r& E% a5 E) L0 ~' L - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">& G* F( v- q5 B
- <html xmlns="http://www.w3.org/1999/xhtml">
7 a, p7 ?6 K; Z! x - <head> {; r; }5 x) E* K0 a
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />2 Z- F6 H8 l: _- L p5 `
- <title>UTF8 BOM 清除器</title>
$ M) h0 C+ O$ s, u3 z - <style>$ j* I+ ^% L0 K2 `- y& j2 I, J
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
8 U: a @: ]5 T+ X4 E: ~; p - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
: E) t3 ~, q w' I6 q - </style>( f6 H9 |5 z4 l$ |0 q* M
- </head>7 Y2 K2 W* L ?' Z3 c, `* l
- <body>- M) n6 {! v) h- u$ p& _
- <?php
; O* i' L" {- m9 T/ [9 Q - $BOMBED = array();
7 J; q) |8 V6 h2 q8 |( f8 ~ - RecursiveFolder($HOME);
1 t8 S& [, |( L* I - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';, X; X; A ^: {8 A- _
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
0 F& d3 n5 N* J1 L& ?' |) }' k - echo '</p>';
% ? U: _, o- U4 t - // 递归扫描
- k! s+ @& }/ C( w- [ - function RecursiveFolder($sHOME) {
# p6 I4 M: }, b; b9 @ - global $BOMBED, $WIN;
2 X" q& z' Z" V; \1 ~% H/ L j - $win32 = ($WIN == 1) ? "\" : "/";
* |8 g3 z5 H$ S I: @ - $folder = dir($sHOME);
' H$ I( i) `! ]- n: z - $foundfolders = array();
5 U8 ~# A+ h0 d+ f3 w - while ($file = $folder->read()) {
$ j9 J7 J* D. S# q" D - if($file != "." and $file != "..") {3 k* ]0 b3 `0 b: j. |8 L1 i, I
- if(filetype($sHOME . $win32 . $file) == "dir"){
7 }) [! a; u( E5 H5 U$ i - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;8 c" K7 g8 W, f* E7 ^
- } else {" `. f. I% s0 l* x
- $content = file_get_contents($sHOME . $win32 . $file);
6 v2 z7 N0 W7 i% e3 | - $BOM = SearchBOM($content);$ J+ C/ R6 C! N' ^4 Y0 F
- if ($BOM) {
4 @ N0 }& M1 N$ W; _2 ` - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
5 v& N) ^) W" g- _; R3 g - // 移出BOM信息* p. J6 ?/ u! h# H
- $content = substr($content,3);
" h6 ^- W3 t* H+ g - // 写回到原始文件
! L5 X0 b7 ^' o4 y: y - file_put_contents($sHOME . $win32 . $file, $content);/ K; r# e9 `$ ?' ?7 P3 k
- }( q( y3 c$ Y7 i" ~
- }$ H" ~8 a$ f3 r( E. f7 y
- }, Z' u7 B/ O2 g4 |5 I
- }" K; h9 N6 e9 |- ~. [! v+ B+ I
- $folder->close();
) B# `1 X% g: b8 L! A$ @0 k - if(count($foundfolders) > 0) {
" M# P# L$ ~, g" R( Z" n; W - foreach ($foundfolders as $folder) {
% x3 y9 {+ B, s) V2 S! ?6 J6 Q' \ - RecursiveFolder($folder, $win32); L- p0 H3 `3 C, n
- }
( y" n1 \+ L4 K( A: Y - }6 ~' R' n$ T0 M- B, B
- }
( w' p' E+ D! |2 n1 D) x5 z - // 搜索当前文件是否有BOM/ a: R; F' w1 A' [, y2 G
- function SearchBOM($string) { 0 K. g& h e: v* B; Q% h; w
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
6 t+ N Q* h1 C! e1 I4 x - return false;
$ E! J" C" v4 J& H" B7 B - }& B* }$ ~5 X+ D+ \/ \
- ?>+ J. T' v7 J* t9 [
- </body>
9 |3 o6 u6 `- z+ H c7 e) D, f - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!/ a, ]$ A+ c2 h# }
! n6 e; h2 b5 x1 }1 K" N |