模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 ! S6 N5 U5 Z" z; _; C
& J9 a% w- v( |/ Y6 \9 z; f3 X3 j
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。9 E( j- N1 F: u P1 f/ r5 y- V
_1 j7 R/ r# Z. i; S6 {% O
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。, Y, H! e& q E: q# T
" m6 c$ t8 {+ U对于一般的文件,这样并不会产生什么麻烦。
, |( G; H2 `) b( p" i! [$ h' l( L3 I( L P7 T
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。& n+ _7 e5 C, ~0 e8 d3 n/ c3 Q0 h
- `9 y( S5 ] l! j [. ]根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 w% ]! N& L- U$ z% Z% h( m3 q* f. P
1 ^8 J& B5 Q6 y- _! Y" Y由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!% ?9 p* E( X7 c- a* C
3 R1 |, s6 ?- g: H& H' N
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ( F+ a: J8 L# i( o
" C5 K& j2 F# r% I s% [( A9 A8 f' x
然而文件比较多,又想偷懒下,使用下列方法来实现。 ) d {) u) r) M4 I
( C1 {$ t0 x- G6 i将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
' }% L5 l* N( q. h( a/ @8 s* [/ v0 I$ E4 w
( [: K% L+ D6 I0 ~5 l- <?php 1 N% G' `$ W6 F/ }- _. X
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)2 C& M2 o9 f& _- O5 M) v
- $HOME = dirname(__FILE__);
* l: M8 n7 T# d2 L - // 如果是Windows系统,修改为:$WIN = 1;
# u* Q+ B/ u I6 O4 K - $WIN = 0;
$ ?2 h& h9 _. T# ]* I - ?>
7 @. ^( {2 a0 l3 L- C4 V - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">( u9 I5 ^3 A9 o5 p6 k
- <html xmlns="http://www.w3.org/1999/xhtml">
0 ?$ M' B( O( o" g - <head>! g$ n; a0 E' s. j4 X
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />5 B+ i/ k T# P o4 [
- <title>UTF8 BOM 清除器</title>$ ~; X5 d1 q/ w" V$ @% ]
- <style>6 `# w7 C& b0 Z
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
7 V+ A- V D& C9 W - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 b0 B# v. Z" L& I {' r+ L6 b
- </style>! o7 A& E/ u4 u
- </head>
* S% A2 w6 { f! E6 } - <body>3 a% v t& |3 b
- <?php
" `- U! u+ r+ h4 D ] - $BOMBED = array(); B# r5 X# B# F* A X% ~
- RecursiveFolder($HOME);
0 Y* T7 j1 X$ B9 N - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
% T$ W, }; y* i* Q - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
( `2 ]: D( q" Q1 a0 n1 J$ F3 x - echo '</p>';, [* n/ B$ ^$ \. C- K
- // 递归扫描
7 W J$ h0 K2 ^2 W& O - function RecursiveFolder($sHOME) {4 B8 L. Z* _/ w9 C, E
- global $BOMBED, $WIN; a, z' v. V+ h; ~/ b: v' Q# D$ R) A
- $win32 = ($WIN == 1) ? "\" : "/";
) S; N- u3 k- l& H2 v - $folder = dir($sHOME);
) @( b( l6 L' v - $foundfolders = array();% S) t' q- h0 v( F& n; d% c
- while ($file = $folder->read()) {7 m' h6 n7 K2 g6 v+ d4 d
- if($file != "." and $file != "..") {' @4 a% Z: h* ~7 u' K4 M: U
- if(filetype($sHOME . $win32 . $file) == "dir"){* H5 A- }+ \; x! Z( A
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;7 a) `0 t! [: N" O
- } else {
- ]# j8 _0 C2 x5 | - $content = file_get_contents($sHOME . $win32 . $file);
& x. L0 @9 S/ X. J Q. s$ M3 E - $BOM = SearchBOM($content);) W$ h+ s! ]4 y9 M
- if ($BOM) {
1 l: q* y/ U) O# c" d+ o - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
2 H- m& l; [% V! g. _; ?) x g - // 移出BOM信息8 @2 L9 s) K, g1 ~& l
- $content = substr($content,3);
7 g/ ?3 i$ K+ W8 I) e0 w - // 写回到原始文件8 ` v* p( t. d" q ?
- file_put_contents($sHOME . $win32 . $file, $content);
# b W* b1 O! z - }" H. P: q" m0 j# n8 S! s7 |' q
- }2 y9 m/ B3 @0 I6 u' {7 G( Y
- }0 R5 c& h7 n6 b1 L" X
- }0 o8 a$ M8 R' v# _; @$ m' g- i/ `
- $folder->close();3 _- ^* G' \/ z2 g
- if(count($foundfolders) > 0) {
8 C4 U2 Z# J Y/ C5 R - foreach ($foundfolders as $folder) {1 ?3 d5 s: M! J
- RecursiveFolder($folder, $win32);
6 L/ o5 Z2 V% z" O - }
6 h; g. o2 o0 v8 I - }" x5 p) \5 Z, J/ j9 q- @9 _- g% ~8 e& N
- }
6 B+ F4 W7 w" h6 g. @9 r# K - // 搜索当前文件是否有BOM
- Q. B3 @* K) K. f - function SearchBOM($string) {
- ^/ b: h) a8 ~- h. \( l3 S - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 k# Q% Z7 f0 g$ T: n3 V
- return false;
) b# k7 n0 ?: J( J - }
. {1 `/ g/ T! W& y, q# }0 R( a - ?>7 v: f' f7 L/ D6 I% e# G
- </body>
' C2 p1 v* e5 Y7 z - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
8 J5 U9 H! d1 c; N, N1 s5 t$ I6 v- w+ ^6 Z
|