模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
) _4 N' W8 Y3 t" q" d% _) D& D+ U. M3 N [
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
$ r4 c- {8 P+ v* m0 S9 j6 @5 u3 N) C6 X! f" ?7 ]) K7 z/ f j+ ]
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ v2 W/ a5 @! ~9 e8 i" A' W- j% k& A3 C: D# t; K7 j3 {6 v
对于一般的文件,这样并不会产生什么麻烦。
6 }# [" T8 h6 [1 t$ j+ o" V, Z" x& S# w5 t5 X% c6 }# r
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。; ?( T1 d$ p; p) L. D% Z2 b8 |
8 j# v) L& [! s
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
0 I) n7 N& X- B# X
" g0 q( k. C/ c) M由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!# g3 D; B6 |5 M' ?: j
3 \: |) Y# k6 l m% h9 s1 O N5 x直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) + a, ^& t4 M& G3 g" c9 @
# f( H, f: A3 `+ V7 z2 q: w" t8 n然而文件比较多,又想偷懒下,使用下列方法来实现。
1 Q6 _, Y9 r4 L4 `9 S8 a3 N
4 y t5 A; ?) e+ H% o- Y* E将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
/ i/ q' S1 ^( R% }4 ?; z8 e6 N# ^
4 j7 Y' [* h: U. e0 ?- <?php
- |0 P7 D3 D" h2 c' J - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)9 M4 h }; |: K, L9 [
- $HOME = dirname(__FILE__);
1 O9 X8 r0 F0 D7 m! Z0 F- y - // 如果是Windows系统,修改为:$WIN = 1;: Y8 V' J* B# f9 p4 ^2 T4 W
- $WIN = 0;
5 J+ T' x! c8 E, d b2 L - ?>/ ]& C' R8 H% h+ q N
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
( o( V; g% U& _# R9 [1 n - <html xmlns="http://www.w3.org/1999/xhtml">
1 K7 v0 {; `+ ?& j. m - <head>: C B6 X9 c& |( Q# ~2 d1 E2 u
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
# @4 V$ @- E7 T1 | - <title>UTF8 BOM 清除器</title>
8 y" ]* J2 l, L* Q! X - <style>$ `2 V! A5 O/ f9 X' O: T
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; } ^. @3 q$ I$ ~
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }: P( x0 |; E$ G% Y) [6 \' v
- </style>
2 I( ?: S" W8 \ - </head>) j T' @ f0 l5 C0 f5 a
- <body>8 g. W1 l9 L0 S: x' y- w; B6 i9 m
- <?php
1 q% ?' [" F( F - $BOMBED = array();
B8 M* F3 G1 u q" r - RecursiveFolder($HOME);
9 P/ u% p% ~0 t - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
3 v$ T5 G4 `. Z, w2 q- [ - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
6 Y2 |1 ^7 p/ R7 s - echo '</p>';
+ I+ R6 h1 \" [ I2 p - // 递归扫描
; W7 w# N4 E6 Q0 c0 w - function RecursiveFolder($sHOME) {
% {1 R p1 i4 ]+ E - global $BOMBED, $WIN;
7 F# Z: ^6 o9 D1 A" y! @- i+ F+ P, z - $win32 = ($WIN == 1) ? "\" : "/";0 y3 U9 R- D- g' v$ e
- $folder = dir($sHOME);: n( Z u! V( h! A, a% b" R: }, O
- $foundfolders = array();
' ^+ ? j, R# l2 d$ V" P6 I - while ($file = $folder->read()) {
' U* c! K g9 \+ M- t. g p3 s - if($file != "." and $file != "..") {& C5 N& z" R( V/ i
- if(filetype($sHOME . $win32 . $file) == "dir"){; o0 x; ?' ~, V6 ^# ?! p! a1 `
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
4 @0 \+ _4 G+ I3 p5 r - } else {# K( W& w B6 w: D/ N' b6 i
- $content = file_get_contents($sHOME . $win32 . $file);
: U* C; z: ^4 ~' S) M - $BOM = SearchBOM($content);
6 E4 ^3 D* ^+ S1 B0 Q' t d, P - if ($BOM) {
* Q- ]# a; G7 B4 Y) o2 ^2 o2 h - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;5 S2 k' o' q, g3 q& D
- // 移出BOM信息
5 H X; l g1 T8 s" n8 ^ - $content = substr($content,3);# o0 j' c9 h" \. T1 _, Z
- // 写回到原始文件$ [6 Z n/ f( ~1 E: z' {2 X
- file_put_contents($sHOME . $win32 . $file, $content);0 B+ b6 Q6 U5 i3 ]' _9 ]
- }
5 v5 l: @( ?$ u) w4 `& J - }& Q! k5 p7 y9 ^6 q
- }
3 e( I% z; v4 y6 G! h6 R - }
T/ U, |( X5 B" T" C; O/ Z - $folder->close();0 p* i6 z) t( M" y4 Y& h0 C+ m3 d
- if(count($foundfolders) > 0) {
' B- F* H8 ^5 F$ }) K) T - foreach ($foundfolders as $folder) {, d( s1 c9 d( q7 i2 g3 V
- RecursiveFolder($folder, $win32);+ G0 ^1 P+ k( H( ]: p6 L( N9 Z" H
- }
% n. N$ F' M, G - }0 \$ {; R/ L0 t9 j1 D
- }4 c" ~% o( E: Z: C' T3 O9 U
- // 搜索当前文件是否有BOM
5 N4 e- B( i1 l" Z& b$ k' l - function SearchBOM($string) {
8 R S4 A0 P' ^: @& M0 k - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
/ }" j) F4 I2 n) Y7 s: k: w - return false;
. t. b3 P% i3 Q0 C - }/ B" K, S0 L5 t
- ?>
1 U$ [- K; m: ^ - </body>* ~' P6 S$ k3 w3 G0 [
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!5 [* O, G6 [' U# l% p1 t0 c6 N
3 l' F- s H& ]7 R |