模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 ' Y1 ^ r& _% \+ c
, \. D2 D6 e4 o' @7 q这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
! `! J( _ A8 d5 K' ~$ p
8 v! G8 Q7 u* l" [它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。. A1 X, r! @% i4 x/ B! y \
/ k6 ~4 a0 k6 O1 ~% R
对于一般的文件,这样并不会产生什么麻烦。
' p& u' N) @ j3 g; R0 a: S' r/ s \
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。; b) k1 V' J+ |; p7 L! C1 x
$ C0 A1 E6 L% O- q P- c& j# U根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
0 c( Z- e4 y1 u5 t+ P) `: v, }0 {" j+ `5 @3 O5 J
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!. G5 y& z W3 ]) C I4 _
9 [5 W% F" C2 E! h& d8 q" _, ~
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
! T- T" P; f c" _6 E c0 C
* U# }- D3 q! I( D然而文件比较多,又想偷懒下,使用下列方法来实现。 ) }* W- q9 x: j" s$ G0 Q
- M' I8 f6 E, L; ?1 t将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" Q/ h4 ]7 N- b C% Y2 h- E$ n& N- i G3 w% C
$ q3 @7 \$ W3 i1 ^# t
- <?php
5 N e( a. G4 x) |) R - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
! e. A9 o" N6 E, G& e- b. A. t, C - $HOME = dirname(__FILE__);9 ]0 g$ y2 h* B" k( \ h8 M
- // 如果是Windows系统,修改为:$WIN = 1;8 Q5 G$ q4 i- V
- $WIN = 0;8 G: i c# ~1 u! K# G
- ?>
0 a6 N! V1 l7 b/ i; \: A - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
: F: k) m' Q% N1 W7 q! L/ c - <html xmlns="http://www.w3.org/1999/xhtml">/ F1 |+ A4 r% ~2 b, U/ K* u
- <head>
6 Y5 q" \5 I+ y3 I) k* \7 l - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />1 {5 B3 L8 \$ c) ^
- <title>UTF8 BOM 清除器</title>. W4 u8 [- _7 u, J% C9 o) [
- <style>
) y* r4 h1 X8 i. }+ @- J - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
) |- R4 v9 p1 M2 v - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
2 N* M# r. u/ E) F - </style>3 f/ E; [( K3 \9 e) S% l7 X
- </head>
+ Q$ _3 V( q; d. i" V1 } - <body>
* U8 f. [: a( J6 z8 y - <?php8 v2 z A b6 c! Q5 ?' }! S
- $BOMBED = array();0 q2 \8 m% d, w4 i/ I
- RecursiveFolder($HOME);
! H+ C. ^/ |( z. M6 L - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';& Q7 ?" ?4 O2 P/ S" p, k
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }# u" z% ^$ X9 ]1 O5 ?4 M
- echo '</p>';3 C3 U3 b" v7 \( M% X& I8 ~
- // 递归扫描
/ K* r( h5 _1 Z+ X4 v0 j7 D3 O - function RecursiveFolder($sHOME) {* g5 }: O# l4 o- X3 P& E, _
- global $BOMBED, $WIN;
0 z8 [4 {# Y8 a+ e6 V: [/ v - $win32 = ($WIN == 1) ? "\" : "/";3 J' w9 L0 B. K8 g& f7 J
- $folder = dir($sHOME);- Q8 ]" @9 j* a% K' Y* o
- $foundfolders = array();0 o, o. I6 i. O
- while ($file = $folder->read()) {' J. W' J+ U. `/ K4 {
- if($file != "." and $file != "..") {
* ^3 @! O0 W2 @! Q - if(filetype($sHOME . $win32 . $file) == "dir"){ p. x8 k0 w( ]9 ~3 C
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
- v8 ?% h" Z- A/ @+ c2 f/ F - } else {
5 Y8 Z( i/ g6 _7 [+ z - $content = file_get_contents($sHOME . $win32 . $file);$ l& H- |8 C. N: \; _+ M
- $BOM = SearchBOM($content);
2 Q* S. T& j& Z; c/ ?. b - if ($BOM) {
% x) ~2 _6 r4 _# Z6 ~* T! @$ [ - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
f8 ~1 l% x5 v7 T: I( ~+ B9 C: z - // 移出BOM信息
" Y2 i H( H" I - $content = substr($content,3);
]* @0 j9 ]6 ` - // 写回到原始文件
\- D( M+ v1 L) R - file_put_contents($sHOME . $win32 . $file, $content);; t) V1 k# \0 `
- }$ E" O, b( a/ @6 k2 p$ P, Z
- }
1 B% t- r, x* H# \1 h - }2 g4 B" Y8 c% H
- }
2 [8 v Y ?: J6 D; x# c - $folder->close();
4 B) E/ P8 z5 ]6 Z - if(count($foundfolders) > 0) {, M0 b# _& n1 T {
- foreach ($foundfolders as $folder) {9 Z9 ?- F( p6 O# r+ L1 F( Y
- RecursiveFolder($folder, $win32);
; x' c! C' p1 G - }
5 f2 `& w7 P Q" w" b - }: f: E( R. U4 L/ N5 h- I( M1 o
- }
5 v8 m# w# a7 A3 W- Z3 E - // 搜索当前文件是否有BOM
# c8 J5 B% ~" M* k' o) {9 A0 c: U - function SearchBOM($string) {
$ u) h% A+ \; U$ k1 a9 { - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;* H j( j( k B: n) y' m
- return false;
7 Q; [. S4 Z5 z/ \; g - }
2 b9 ^+ q8 `. d - ?>3 y# c( C; K7 |# T; n
- </body>- D+ V6 c: w5 m9 S+ Y' Z
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
3 W7 Z8 M& c0 e8 R* A7 {6 x. N9 f& _! [
|