模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 / z. B/ r; ?. @5 O& R+ l
) _: p3 v3 u$ X这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。8 m x( U( |) H
, V; e# g3 R* z5 [6 v
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
+ b5 \7 ?! @4 o' a6 E" ?/ `2 \+ {2 }+ ^* B) r& o' {
对于一般的文件,这样并不会产生什么麻烦。; H/ y) ^, M% F; H
- {0 {; H3 S% v5 J6 o6 w5 }但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。. ?9 O+ w/ l3 t$ M' M3 S* v& B
- l- Z C8 X6 D# s# w5 O+ m
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
+ }! t# x5 F- I: s/ a2 J9 A
6 j! A* B4 x. \! Q& {- n) G由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
9 x. }6 F) m: a% O! V
9 m+ e& a# ]* \, n [直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
5 g" r* P0 t! k& U) J, E9 c3 V1 J: ]1 o4 m! c7 T7 e1 T6 ?
然而文件比较多,又想偷懒下,使用下列方法来实现。 : D, G$ P9 j* @8 C
/ `+ r- h( c/ S8 ?2 F1 y/ R
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
% W3 s0 N# K! }* T: a; a
, Z9 h% v% A8 I
+ j3 U: {& F% W1 l2 ]$ r- <?php
0 @* Z d2 i' ^7 q. Z - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
' W* y3 Q- {) h9 R3 @8 M - $HOME = dirname(__FILE__);2 D3 R! s2 W6 r) @4 S; K
- // 如果是Windows系统,修改为:$WIN = 1;6 D3 D9 J8 Z" M* L; k" M8 ]% w
- $WIN = 0;5 W i! y7 E2 D. T
- ?>! W1 l* a0 ]. @0 v. k
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">- M' E0 G! D" [
- <html xmlns="http://www.w3.org/1999/xhtml">
, r) B, f6 F" E2 C9 K& P9 Y! h4 _ - <head>
( b L7 U5 e8 t% m! z - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
M+ w5 w) t; y$ w& \# Q; b* Z - <title>UTF8 BOM 清除器</title>0 V* n! d# W! R# w3 D. K$ q
- <style>
0 x. |9 T+ f1 s+ P$ O' y - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }+ H2 P4 X1 l4 @( Q9 p+ N; |
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
- c) `1 \ ] z, v; F8 p - </style>" y5 b' S P+ P- x5 Q
- </head>
. |; O4 g# ?6 i: d' E - <body> b6 o+ m3 l5 d6 H) B7 B
- <?php: W! A7 s: {! B3 {) ~
- $BOMBED = array();6 A4 d* }8 Y1 G/ ^1 G
- RecursiveFolder($HOME);% D6 Z% l( j. G4 d
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
( }8 |& v ~, W1 ]- P" I8 A1 f( p. w - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 G# F& @/ W' G: G' l' i
- echo '</p>'; S* }7 L0 _- V: E, _
- // 递归扫描# }6 c& a6 S; Z* S
- function RecursiveFolder($sHOME) {
: z4 H. R- f' A F p - global $BOMBED, $WIN;
; F5 c! K4 u) C' r - $win32 = ($WIN == 1) ? "\" : "/";
; Y0 l/ Z2 l; q - $folder = dir($sHOME);- Z- i# U/ Y. W P- l
- $foundfolders = array();3 ?/ p, C3 [5 ^& m: y$ X7 L7 `
- while ($file = $folder->read()) {
; P- F8 |6 a# @5 i - if($file != "." and $file != "..") {& \/ D( ~8 e, W5 C7 G
- if(filetype($sHOME . $win32 . $file) == "dir"){
/ A) I& i% ^2 S - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
3 Z }2 K( l0 n9 H - } else {
9 }+ z1 \/ P8 i- ^8 r, X - $content = file_get_contents($sHOME . $win32 . $file);: F# V( A7 d8 f, Z
- $BOM = SearchBOM($content);
v0 e0 b; e% z5 D: A, @2 ]- E+ M2 u/ X - if ($BOM) {- h) z& l3 A6 T$ `
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
2 b; I7 V' W5 l" U5 [, Z6 [7 w, z - // 移出BOM信息% S7 o! g1 C4 V% A8 V( k
- $content = substr($content,3);
4 v& P% w% u. b _; n - // 写回到原始文件& ^3 \, i& B* G6 u+ p x8 w
- file_put_contents($sHOME . $win32 . $file, $content);
/ ^7 T& q6 d j5 c& m - }& n% |' n7 b& x7 n, e
- }' J- B. ~ i6 R+ x# O, B
- }
/ \# _$ g: |( @. g6 Y) \ - }- f1 x1 X3 a# Y8 J7 i% s3 X
- $folder->close();
: C: B8 D) ?5 n) Z3 B - if(count($foundfolders) > 0) {
5 H$ X) q; [. U9 p9 { - foreach ($foundfolders as $folder) { ?" W- J% O: a" w4 M6 k
- RecursiveFolder($folder, $win32);
/ ]7 W9 @. z/ ^7 L4 O9 i - }6 K% F( M/ q+ {; [+ f6 p4 W
- }- |, Z6 m% @, I. |/ T! r a
- }
5 U* m. v3 ]" y* F' V/ t - // 搜索当前文件是否有BOM
4 K7 ~- I- o/ W4 D - function SearchBOM($string) {
! k, K3 {9 V$ c `) O: ?$ @ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;$ y6 M5 c6 Z& }1 b3 W
- return false; p1 _3 R* r* |5 M) Y
- }
, I3 N) @- k- N3 O) `& X - ?>. z3 [$ w. w1 I# T" r# v4 t
- </body>
% w9 ^ w9 M7 s - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 ~, E' k, Z% B, g) S
( K( {' q* ^* L8 z0 M; Y2 q" ^5 j: v9 O |