模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 - @! A( J, o5 y% k
$ L' ~" S- ]# }6 N5 Q0 }9 W
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。2 s8 O6 _# Z. L, i
: X: Z: y) v y1 @% ?它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。2 g% I8 _) ~$ H$ i9 d+ y% X) p' b4 Q
) ?+ g' g2 U- z F( t) R9 G# z) ~
对于一般的文件,这样并不会产生什么麻烦。
' R' V6 |8 F" l; A5 ^) j+ O2 i2 Y! ?: _ J
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。/ g# K T+ G1 W7 e
3 b4 r' {. w i
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
: i: S, j3 H! e6 ~6 Z) b
' t" Q! a8 M; G& [1 ]8 Z由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!; l) a c3 u+ P4 o6 \, r9 a2 a" s; C
5 D+ Y$ e8 E4 P" D, D* O直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) / D1 x" L$ X( O' p
0 K- L6 y5 ~7 W然而文件比较多,又想偷懒下,使用下列方法来实现。 0 h- B5 B, P; t& V
* f; e! B4 v7 w; F3 l0 z8 g2 f/ J将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
& x$ r3 j4 ^) k6 C6 o( G; e0 X6 j' U- g% F' \6 V
2 i7 D" K' N! f% s) Y7 |- i& O- <?php 7 |1 p- N& t t! r
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
# z+ Y# e9 I! Q( l# ]) w8 T - $HOME = dirname(__FILE__);
2 n8 J' N; a6 I4 E" o$ E# U% |- A - // 如果是Windows系统,修改为:$WIN = 1;
1 S) N( Y# c i, W - $WIN = 0;$ E% w/ ~& _* u5 N0 |
- ?>
8 r' v; O- U; C2 q& @, Q6 M( s1 d - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">3 x, F8 s7 t9 c- v! v
- <html xmlns="http://www.w3.org/1999/xhtml">+ C. J7 [' e5 a8 K$ N3 E7 Y
- <head>
0 p2 j5 H9 R2 [0 M4 P/ ^( M0 A, [7 ` - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
! }- R8 ]: X0 e - <title>UTF8 BOM 清除器</title>. `' f, q* Q% X$ s0 V" M' }0 @* ]
- <style>
6 h" }2 N. c+ N; I( W - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
2 e+ E' j9 s+ X4 k - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }1 m2 _7 U) {3 H+ J0 G) s; @
- </style>
* s; y" c) I) s- l! k - </head>+ O7 L0 e+ X% o2 l0 Y
- <body>
! m8 u" n, H/ B$ F1 F - <?php
2 E. X. ~! ~5 m. ^* c0 R - $BOMBED = array();
6 B" L. {- Q' J4 A8 v - RecursiveFolder($HOME);
: b; t4 T! Y9 c# Z; w - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';& I9 D# v$ Z. ^# s/ Q! o
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
8 S$ j* k2 L% r0 E/ _ K- w - echo '</p>';) \* b* t0 z' A
- // 递归扫描: T b8 g4 r( F- h/ Y
- function RecursiveFolder($sHOME) {) h8 a; p$ k) u7 p5 M" Y
- global $BOMBED, $WIN;
/ i0 Y% h0 H0 U& O9 f - $win32 = ($WIN == 1) ? "\" : "/"; I6 D* `2 P# D
- $folder = dir($sHOME);; @+ |9 X- p' _( p9 Z1 n) u# N
- $foundfolders = array();! ]+ J4 r* k3 t1 ]0 ^' e! @
- while ($file = $folder->read()) {
! U- `% ?% t$ g5 C - if($file != "." and $file != "..") {
7 @$ W& @0 S8 a" E O - if(filetype($sHOME . $win32 . $file) == "dir"){3 `0 a9 Z: E F; J
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
$ d) F6 V$ F2 z! G( e - } else {+ n6 d$ t2 y5 v/ ^( t" s6 R V
- $content = file_get_contents($sHOME . $win32 . $file);
' o0 Z+ w7 e/ u0 p& ?6 K9 n - $BOM = SearchBOM($content);
9 j6 I% L; H0 H1 z1 ^$ v - if ($BOM) {3 h% M% [6 V9 Z8 N& o
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
I" {7 e! D k - // 移出BOM信息; s0 q% G; d+ X3 M [3 j# x* p, L) Q
- $content = substr($content,3);# e4 S, N; b9 Q' o7 R* a
- // 写回到原始文件
" K1 D) Y/ N; y! @$ y - file_put_contents($sHOME . $win32 . $file, $content);- h5 R2 x4 W/ ~- D/ w( |- Z
- }2 g1 d8 w' k0 y' ^
- }
7 f. m: `) w9 d+ f. l( Y. x0 B - }
! z! L# \% d& i6 | - }
+ G2 Q4 J* J. P - $folder->close();
" C; t0 q/ V0 J& H* h! B+ n( M. H b - if(count($foundfolders) > 0) {8 t. U/ l( S4 b3 G
- foreach ($foundfolders as $folder) {
' S) k" B2 J" W8 i5 @. m0 D4 v - RecursiveFolder($folder, $win32);! y5 i/ E! I# H8 N* x
- }
! S( }- ~) k k' W8 B) K K) T8 c9 e& } - }
$ G5 k3 b) }. V% I0 @1 B9 w - }5 g: N& E$ c8 _) E7 y
- // 搜索当前文件是否有BOM
: ?: ]1 d6 }/ q( p/ r+ C - function SearchBOM($string) {
0 h; C+ J) p" t/ } - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
# U0 d# }0 F, R& ^ - return false;
2 s4 ]: f1 U5 i* a9 B - }
* E. R3 G" A/ |2 h) ?# _7 z4 Y - ?>" E8 N# v5 x6 l: H) D c
- </body>
" T4 z+ |6 }' a - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
7 i2 \9 C& u6 h; Y- I( R+ l9 m8 V" x: j
|