模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
; W: W( R' }1 D
. A; s- F4 ?: B% p这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。) M* V/ l9 ?; b% k( Y
. X* c) T7 K+ b8 c5 o/ n
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
- S0 `' X6 P1 s) F* W9 y# M* K* [- W
对于一般的文件,这样并不会产生什么麻烦。
9 O; f( V* ^- W* z) ?, o; q
3 d) {! N6 U" q' ~; M但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
; \/ w5 O5 _& p9 \; a* q
7 J9 v, s% Y8 D) x+ S! p根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。! x! }# T1 q8 X; T6 J
1 T: [; j" C2 G由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!+ n2 u4 _' ?9 U" B) F! F0 r) A
8 \! f% r; A F* m0 j8 c2 d5 L! y3 y直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
! Z. O0 Z: j) ~7 ^6 q& d1 ^! x
然而文件比较多,又想偷懒下,使用下列方法来实现。 N, H( U' S) C' e$ @
& o8 [) F2 W& b% y3 b z% y; G
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换 n0 `& q* M% k
0 b: X! [9 g: H' s1 \) b1 Q
9 u n6 _5 t3 {9 ]- <?php 0 s) S4 D$ n: N) @" {6 k% y+ U
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 N/ ]/ o5 ^: y& x, r7 s( H" \* i: s
- $HOME = dirname(__FILE__);
6 [5 B/ B8 ?. p3 v& v - // 如果是Windows系统,修改为:$WIN = 1;/ \' H1 `( ?( z" O2 z
- $WIN = 0;. U( x# O. B% c5 I7 O8 Y
- ?>
) C2 o- ]- b9 F6 C+ n- p/ D* } - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">$ v( n8 F7 [9 ^
- <html xmlns="http://www.w3.org/1999/xhtml">
: O8 M. Q2 j9 m4 @# n - <head>
" g$ p' v- {9 f$ ^6 u- y - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />! V0 ]0 t. C$ V- Y- [, Z
- <title>UTF8 BOM 清除器</title>
$ t d4 `; a: Z% R7 [& B - <style>/ h. Y$ P% W8 X0 W
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
& G2 o. I; d8 e - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }2 X3 x- }1 V7 s, `+ \% n2 i+ X
- </style>
7 `+ \- |; {/ C - </head>* S; [2 s& M1 k
- <body>
9 [& p$ d* `- q/ H. T( u" h- b - <?php( I* i. D" R4 C4 Y
- $BOMBED = array();
3 n8 Z% j- v) l! b - RecursiveFolder($HOME);+ p6 _0 W$ Q2 b% v
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';% i8 i' z ^; i; f
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }: M2 J. w" M% ?$ w0 d4 T% F
- echo '</p>';6 Z) K v/ Y9 M5 D
- // 递归扫描) O% u8 F1 H' _7 N+ C
- function RecursiveFolder($sHOME) {& w% b' I6 r, X) a* h& g
- global $BOMBED, $WIN;
- b4 l! X* Y2 H - $win32 = ($WIN == 1) ? "\" : "/";: \. x" R# X! P( i3 n5 q ~
- $folder = dir($sHOME);
* W- v! }8 R- E) ^, l - $foundfolders = array();
& W8 q( G: r% c3 |0 i - while ($file = $folder->read()) {. o! E2 r$ ]' M+ a
- if($file != "." and $file != "..") {
$ u. Z1 Q, h) ` - if(filetype($sHOME . $win32 . $file) == "dir"){( V. i: d1 a, |
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
! ~) ?3 u1 G$ `8 ^! k - } else {" \9 @/ n% ]! A4 t4 O# M
- $content = file_get_contents($sHOME . $win32 . $file);
! u. w% d# R6 s9 f: E1 ] - $BOM = SearchBOM($content); b) @% J+ R% z* R* p; A9 O2 r
- if ($BOM) {
7 b7 q! n+ ~) p' y4 [ - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
" d/ D, p9 {' i - // 移出BOM信息
7 T2 H: m. ?2 \ - $content = substr($content,3);
Z [/ O& ?! p# @' j3 G/ z - // 写回到原始文件
5 V: W+ i2 i$ \2 \/ s# |- J _* u# J - file_put_contents($sHOME . $win32 . $file, $content);) \( K. x6 w, Y$ T4 A
- }8 u! R- T# b. ^ `6 [2 T
- }- s" L7 {8 u+ x
- }
4 Q: ^% D8 t% q& n3 ] - }
" p! N7 B* T, m" U - $folder->close();
! V3 _& ~; ~( w0 L$ E0 l9 d7 G, \6 _ - if(count($foundfolders) > 0) {+ G0 {( u$ J9 m [7 O% D: d. p
- foreach ($foundfolders as $folder) {% R$ \, ]# f' E$ J7 t0 @) G& Z
- RecursiveFolder($folder, $win32);
1 v$ `2 C" [( h4 V: P" _- |/ y - }6 ^9 A/ Z8 x. s9 O% y" K/ p
- }8 X9 n' A7 G6 V) b
- }
% u, z5 D" w6 [ f, F - // 搜索当前文件是否有BOM. S* O+ B F1 A' a$ v1 u/ |
- function SearchBOM($string) {
: A4 B, k/ l+ W; j3 S+ e" v - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
5 D6 P9 |0 F/ N7 o& S4 G - return false; . [6 R) t p2 `
- }
) p1 X8 ^5 k7 W5 w - ?>. G- R& x7 h" \4 Q
- </body>
9 B U8 I6 X8 @% V* a - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
* u6 A M; q1 `
|/ P! \0 M8 S8 G* R% d! w$ [8 L |