模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
! U( f" J6 P0 h. K8 U
& I6 V8 D, g S8 u2 v1 Q" I这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。. z8 }! D2 [9 |. B( U" ~
2 b+ ^! G" L4 e7 ^8 |
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。0 D" {7 w' h2 i
$ i& V3 f. p. m# K [' ~% l5 h
对于一般的文件,这样并不会产生什么麻烦。+ S9 w5 S( @/ w% S2 q/ J Z
# P `( {8 u4 c! n" u% i4 V, n
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
. D, f: n F& z# V4 \6 X# `
1 H3 u( E9 G: |- K* B- `7 e. v根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
0 D2 P! a9 u9 a5 }' k. G3 ?- U# t4 d* z9 ]4 C. j
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!0 l" m. c' [ j% d9 z8 c
! H; T1 C8 S, i* @$ C直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
$ ]- I% J% d6 l7 p: t; t
) c1 ?) g$ L M! W/ }. r4 |然而文件比较多,又想偷懒下,使用下列方法来实现。
, Z% S7 l, U2 W" u9 C" x% X! I7 {# }9 [5 J
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换7 t, Y* w$ S+ v3 r" r9 B
* m$ m" E2 ?2 h7 b$ `1 ^4 n7 n8 S; M
% B1 V1 l* ]5 ?; ^# m- <?php
. i, d5 k/ p% H& T - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
: ]/ O) k0 Y1 | - $HOME = dirname(__FILE__);
4 A" v! T, b; k - // 如果是Windows系统,修改为:$WIN = 1; X( J, w( P3 M. z
- $WIN = 0;
3 o, A! Z4 ?" K4 {- S - ?>
' {2 X7 r6 B( ]1 H5 \% U# X% R - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 C* W/ o% z' _0 B" b
- <html xmlns="http://www.w3.org/1999/xhtml">; a6 I! m' U3 P
- <head>
( K! S( C- J" V4 ^9 W3 J: I6 ?9 y( g - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />( u% }. l' a4 H7 J/ b# v5 K
- <title>UTF8 BOM 清除器</title>. k, u0 f) c7 \2 F4 x. ]! J, E
- <style>9 a) _- W3 `* z' k% H \
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
9 c2 c* V0 t% V9 [& k p+ y - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }. {* ~ I" @- o8 }( A, P
- </style> j" @" j7 S/ r/ H7 }
- </head>7 ^. R, l0 F. h l) S: h2 B+ m
- <body>6 P |& c7 L5 O+ Z, C5 Y
- <?php1 k3 u7 ]; O! h* A
- $BOMBED = array();
S! w" t2 P8 a5 n - RecursiveFolder($HOME);
- J9 B' f f0 h0 n; q* F" Y3 {9 H - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
+ p& u0 [2 x5 G - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
& u. E# x* f8 } - echo '</p>';4 r5 ~2 s! j$ l! V* \9 T& |
- // 递归扫描
/ k* i5 S3 F2 f) c% ~$ G - function RecursiveFolder($sHOME) {& r1 H5 B, N5 t9 x3 ?
- global $BOMBED, $WIN;! U/ N8 M4 Q( n6 E y; d4 X
- $win32 = ($WIN == 1) ? "\" : "/";
, W9 o* J: r' Q8 k1 O: o - $folder = dir($sHOME);4 _4 I% G; R: m }" l1 e: N6 b
- $foundfolders = array();3 Q b1 W$ s H. [" `% s5 P( i
- while ($file = $folder->read()) {/ q. h0 c7 L. s! x0 V% K) G" F9 H. w
- if($file != "." and $file != "..") {. C' k9 _. X, w" z' { e
- if(filetype($sHOME . $win32 . $file) == "dir"){
0 e, h: c7 w+ A$ K - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
( B9 l+ X" U( _6 e' O* [9 c - } else {/ O" L* f. U$ q: I+ e" `" q5 x
- $content = file_get_contents($sHOME . $win32 . $file);
% S! `3 B' b1 K9 G9 e5 u - $BOM = SearchBOM($content);
7 Q1 s: v" k3 p3 M' K! g8 I+ U - if ($BOM) {/ z' v4 f; _) O, ^0 e& T1 J+ o7 h
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;' [! }; ~( y8 O1 g
- // 移出BOM信息
! h3 ` P+ z1 ^5 \( ~ - $content = substr($content,3);
) I* r1 ~( _) M, B' q: p' d: B - // 写回到原始文件
) \1 e* f) _% d/ e4 w1 g - file_put_contents($sHOME . $win32 . $file, $content);
, @( A8 ?6 `( R( ^- W2 J" K - }' L' J# R- G' k3 Q4 B
- }
# X6 C, m6 {0 Z - }. i: }; ~$ [9 G' C
- }
% r# O6 K/ N7 c- H - $folder->close();
5 \5 v" r, {, U6 y - if(count($foundfolders) > 0) {3 S/ N8 p3 W9 @+ T8 ~
- foreach ($foundfolders as $folder) {
) d7 l8 J- f9 E3 |3 o# C - RecursiveFolder($folder, $win32);% ]# i. O# u P9 j7 H3 L) ]) B
- }
5 [- v8 S$ U1 Z( k$ ^$ ~ - }
* r2 L, ?8 |5 a7 o9 _( ? - }, v$ ]9 C& \$ l/ p* U/ l
- // 搜索当前文件是否有BOM$ ~3 T5 E9 | v
- function SearchBOM($string) { : U* M6 t" N% d) R
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
6 Z1 C. h/ C8 _. P) I) _% {* d - return false;
9 a" T6 w; Z1 Y. @. Q - }
, s" k( u% N' G& p1 D' v" C; w8 Y7 s - ?>4 ?3 H# U1 C ^
- </body>' I8 l1 j# F% b, W; r
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 ?+ G& J$ D9 M6 C4 p
/ Z3 K* |! U N* ]5 @3 `9 R7 H6 x
|