模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 % E2 Z9 ]- D: r! J
3 o2 J, N" j* V5 y% K+ d8 e! x这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: y9 E0 I% @! A! e0 }0 w
, a! N) S! h& @: P8 Y+ v. u它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! r! C& ?5 c9 G6 ~) ~
v/ U$ i, U5 d3 V: W1 q6 C8 }对于一般的文件,这样并不会产生什么麻烦。% t7 V6 q5 [) i/ k- @
. a- _8 w3 a6 ?: l: X8 C
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
% G$ C; ]! q1 l% u. Z3 Q( c/ W ]
2 [1 j5 T4 G. u: F# m根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 A* f( f R& q+ t6 @9 ]% b$ }
: C4 W) M7 |- b( P3 |由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
! p" m* x y: W! [- @' j; C0 O0 q1 H
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) ) t' p7 C; b* ^# A5 Z0 ?$ `$ P
$ O1 J/ H, K; M9 [3 f
然而文件比较多,又想偷懒下,使用下列方法来实现。
% W- S9 y" Y' f+ @) Q/ h, o. b- j& ^/ \7 H5 O) ~7 H! P. W6 m
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换7 F% ]6 P/ c7 V( L3 A
7 D- \, x& N, @( B8 _/ W& b
4 X6 t5 h0 }8 x- R3 g( G- <?php 5 E% j5 [& \5 `# O' o+ V& v/ ]; N
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)- f1 v6 m: s7 I
- $HOME = dirname(__FILE__);
' q, g/ @! u$ H, a - // 如果是Windows系统,修改为:$WIN = 1;0 Y( @$ {6 g" S/ E9 O
- $WIN = 0;
7 O5 d" J* N6 N$ o - ?>) M: L1 \; |$ i. {
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5 D1 P! F& p# X: P1 |; g6 o - <html xmlns="http://www.w3.org/1999/xhtml">3 r7 k- H1 T" w. j* L0 {
- <head>
8 i! Z$ \& J( B; } {; u8 @ - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2 |3 N3 O( Q: X3 q* H Y2 Y) } - <title>UTF8 BOM 清除器</title>* J4 q+ W' P# ^! s. W
- <style>1 i" z3 _- v1 p3 e% `
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }; O0 g6 {& l; Y2 `/ r a. i# n
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }4 [8 [0 P9 _/ n v! D$ x* d( {; R
- </style>9 R. W/ ^: N0 h3 ^
- </head>
" x7 X! g+ J0 ^/ {& k. I w - <body>; E# U3 l" C. H* L. A3 L! N
- <?php
E) n# y2 b5 c3 ?2 E" l# u$ E7 j - $BOMBED = array();
5 ]/ R0 O0 a# T. f - RecursiveFolder($HOME);
7 k8 Z1 x% |5 ]+ y, I1 d7 N - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
$ Y$ I$ _# U5 V8 [/ R+ l - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
* s0 {' D2 ?; S8 _ - echo '</p>';+ s' p$ U8 k' O9 ]; P, z1 H. X
- // 递归扫描
$ v6 V! C8 @" I3 B/ U - function RecursiveFolder($sHOME) {
$ p' A/ ]* \! S3 h7 ~+ c - global $BOMBED, $WIN;6 W) k) [! [6 d# n) y0 C
- $win32 = ($WIN == 1) ? "\" : "/";
6 c# ^1 A7 X4 ~$ A! e9 e - $folder = dir($sHOME);$ R& E- Y2 M/ u. g9 C
- $foundfolders = array(); K& B, Q* R) B0 ~: h
- while ($file = $folder->read()) {
. \! w$ b5 o$ d" W1 N3 ?" K - if($file != "." and $file != "..") {
& I, G* w( k' T+ Q - if(filetype($sHOME . $win32 . $file) == "dir"){
, H8 R' V4 s) @ O! ]$ K - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
" I3 S* w9 @3 y- O/ i7 W) L2 } - } else {; `4 F6 W. f) d7 T
- $content = file_get_contents($sHOME . $win32 . $file);2 L2 v2 o! H F. {: x4 m
- $BOM = SearchBOM($content);: k' u* X5 O# e# G; z- p
- if ($BOM) {$ z; M- p2 I7 X
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;* [* k" P3 d6 Y. k
- // 移出BOM信息7 `' @, A# |) E" T
- $content = substr($content,3);
6 O: n9 B8 V. Z+ P# H; }: V - // 写回到原始文件
+ {1 W5 H7 {: z, v8 x5 s5 A - file_put_contents($sHOME . $win32 . $file, $content);/ }- _8 O; r$ Z u* K h
- }
4 b% C# H) j2 U - }
( ^* f- [5 w" B3 G+ L6 W - }5 y6 _3 Q2 Q& u/ m
- }
6 d- d" t5 a8 C" @+ o - $folder->close();
2 g1 x. n0 k5 R6 n$ M - if(count($foundfolders) > 0) {7 f ~) A2 g7 ^$ O8 ^' O, ^: c! ^
- foreach ($foundfolders as $folder) {
9 u; R0 Z# V7 n) _ - RecursiveFolder($folder, $win32);
$ O1 I& G4 @/ J, r& g: F$ K - }4 v, f- Z# t6 ^: p% I" v! D
- }, i6 q& o+ N- v% [6 S1 j
- } w2 v: ~% {* k) G& p: @
- // 搜索当前文件是否有BOM
5 N* x1 Y3 q0 N0 |: C' D' N - function SearchBOM($string) { ; q% ~4 y/ ]# U& r/ x0 ~
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;, A% ]5 }4 d4 l o
- return false; % U; _ _- C, @& S& N: B9 W/ Y
- }
) N& k+ W, J8 F1 Z - ?>( R, Z' M7 {, ]1 Q4 ?; T8 D
- </body>
$ \2 d. {$ P+ ] - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
6 ]) w8 g c3 ]" ]/ z
% }4 I8 H+ H) f/ e6 ` |