模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
; D# O" `2 o+ U) C
) ?$ g0 j5 I1 p4 d9 f$ V这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
# ]/ p! r- y- @& x* H5 l9 Y) @, I( Y* t$ _9 C
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。* z% U5 _1 \' ]8 g1 Y J3 r6 X
$ J' E5 p! ^6 c( \1 y对于一般的文件,这样并不会产生什么麻烦。# X# W* a) i0 m0 W) f; R. @
: Z% q+ o( K7 g. q; j% s5 y% s但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
% ]5 x3 U; H% O, O9 K
* R% p3 T; ` o# Z# p+ q根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
- L$ N6 I ^0 k" J9 W* ]' L: j$ l- Y( D; }/ v+ a7 x( u
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!# A# \. Q' p0 N. g+ s7 T
* T. _1 e3 n8 Y6 Z& x1 M9 S
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
7 J9 H/ z9 P+ N V( l& I; e% s' r) D' f) N, p0 a
然而文件比较多,又想偷懒下,使用下列方法来实现。
4 {" d& l. ?9 Z8 r9 e- K+ x1 T H3 D# I' h0 P% ^; Y( A
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换- I9 N& p" {6 ^" x& W6 B4 M
% ?" X( |. P# Z7 n7 H2 X: U
9 K$ v0 v k+ b- [/ W
- <?php 3 d1 w9 q% [4 s( }4 ?( b8 n* b
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)$ H9 V$ Y* ^1 w; D& A- t7 D
- $HOME = dirname(__FILE__);! k+ o' \! w+ L/ E' G" S1 ^
- // 如果是Windows系统,修改为:$WIN = 1;! q6 s, }- f7 H& e9 q' p: j
- $WIN = 0;
2 I' O) V; h3 B4 w5 c+ c - ?>7 a8 x# @: i" c( w# U
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 d! Z0 @( y, {3 P) z
- <html xmlns="http://www.w3.org/1999/xhtml">
. s h0 b5 n" X, j0 v# K- C - <head>
- O9 V, C/ K+ G( j - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
% H; K( B3 k2 `" e/ L - <title>UTF8 BOM 清除器</title>
* A5 w; F- Y* a, E4 l8 _ - <style>1 j7 R# S* t3 k3 B7 p+ w% D
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
) w. d, U$ h5 _/ ^2 y - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 s. ^" d4 q1 C0 d
- </style>. x0 w- \- P; ^# \, ^' f% q
- </head>( r6 L1 ^: [6 i3 H+ O
- <body>) h& F1 y( n5 [. V
- <?php
7 _; y+ Q" N, T$ |& L9 ^ - $BOMBED = array();6 _/ G3 R2 I, ?. s% v9 ]- ?+ P; E
- RecursiveFolder($HOME);0 C- h6 z+ O: T( S) u! [
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
! V3 f; T% }* t - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }2 y2 R5 ^4 W& q* D+ P1 n7 a
- echo '</p>';4 N. ]+ d/ I* N, b+ X+ Z0 x4 B0 R
- // 递归扫描* H) a |6 g7 {3 R3 D
- function RecursiveFolder($sHOME) {
0 T/ R8 z% W3 H1 D$ w8 d - global $BOMBED, $WIN;
% v4 M) I: O6 A( {# j+ ^ - $win32 = ($WIN == 1) ? "\" : "/";
( r+ t5 \% r' z. o - $folder = dir($sHOME);
* e) V% P% Y+ K: t3 h& O* W! `1 @. M4 f - $foundfolders = array();- k4 p3 h: x" L* E
- while ($file = $folder->read()) {& H4 v; u. @4 k! ~: d! t9 Y0 y
- if($file != "." and $file != "..") {
4 U' y3 R: v# o6 w - if(filetype($sHOME . $win32 . $file) == "dir"){
, t' X! A" p2 i - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
1 C3 z- W' {$ [ w" L - } else {' I& e' Q; a N! L* e8 `
- $content = file_get_contents($sHOME . $win32 . $file);* A* A2 G7 f& |' J2 N1 m: O
- $BOM = SearchBOM($content);$ ^; Y5 u' f- F& l* {8 W8 Q }
- if ($BOM) {
* c( S- J, X& _) O - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
3 l) ]" j$ P8 U5 c& Q - // 移出BOM信息
$ `' q3 o7 P2 z& ~; _ - $content = substr($content,3);
$ Z" k$ y- p0 ~3 R b( [ - // 写回到原始文件4 \& u/ {" {+ S3 m, S4 W
- file_put_contents($sHOME . $win32 . $file, $content);1 D3 w9 \3 b% Z( d; b0 a
- }' S: Z, i# G. w# @+ }/ \
- }
; s3 x( ?& ?2 W; p' c - }
% f3 Q0 Y! q. N! S V# B - }
* C2 F: U W( D$ X9 ^/ J - $folder->close();4 }8 Y3 n3 A& x
- if(count($foundfolders) > 0) {* S6 l, [/ b; ]+ M
- foreach ($foundfolders as $folder) {
' }, c$ y- x ?9 k7 ] - RecursiveFolder($folder, $win32);+ h6 ^8 b/ Q) T5 X) @( c$ ]
- }+ l; q' H( {9 ?' {
- }" q% |, G' H1 ]) i, d, y' i) n
- }
1 N5 `6 n' U0 p5 Z) t - // 搜索当前文件是否有BOM
7 F) \/ P8 I7 i - function SearchBOM($string) {
' k) b0 B' v! v! [ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
: N8 w" X1 f" U+ V1 D - return false;
/ j9 d ^ B$ ~' `& H - }& d, n$ n+ A0 p' m1 _
- ?>
; q7 \! M7 p2 H - </body>: t* [% d" j( P
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
1 n% {. ^7 u6 ~& f' F$ _; L4 A" f& ]/ S7 @( |; T! H; F! h( D
|