模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 / i1 @ E* P8 l- `4 N5 Y/ Q D
3 N5 O8 P0 J) v: u4 M
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
+ a7 B* ^2 R# r9 ?* l# I
4 V1 j: x0 H" l+ s0 [' Q+ @+ b7 J( d它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
6 i6 c- l0 W( a4 X, Y. p
3 c( D/ {5 m8 T! i" y对于一般的文件,这样并不会产生什么麻烦。
: t, f4 S: w1 S. F) P. r6 f3 w8 v0 ~5 O* [" n+ r- G) E7 N+ d
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
6 l n5 A1 D/ x& L4 y% F& F; [- k8 }8 k9 k9 D$ _/ c( Q) U
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
: ^! N- k9 v! _: a2 n0 n/ Y W* l9 F, i0 r
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!# }0 W/ g" ?" Q6 K/ \
8 ~! j& M6 x: U6 V# U直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
8 J$ ^. y8 A1 U6 s0 J5 Y( E4 j; R; \% r8 Z
然而文件比较多,又想偷懒下,使用下列方法来实现。 ; n) w/ ^2 X8 \
$ [5 c1 Z2 J+ w6 n
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换/ O+ V. c, i% v" c1 a. u0 I
) e6 z1 Z- J) n! ~. J6 W9 u+ I; H5 h4 N7 p8 z2 ~3 s5 s1 a. x, g
- <?php
" X4 N5 O/ I- o4 |% Y: z - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
; i: _) L/ s* d! @1 q - $HOME = dirname(__FILE__);8 @7 D+ o( Q1 l3 `9 I
- // 如果是Windows系统,修改为:$WIN = 1;+ ^ H% ]* s* F3 G; a7 n7 K% o; X8 n
- $WIN = 0;, [! m7 l8 z1 N
- ?>
# I5 a, x- R# V - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
( _) m6 j2 \+ k: A* F& W- X - <html xmlns="http://www.w3.org/1999/xhtml">( N h4 z' _3 L( B/ |7 Y
- <head>/ z1 H! i- T' S+ q k
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1 Q" o4 O7 q4 _5 K - <title>UTF8 BOM 清除器</title>7 n6 t4 C. q- Q( _" V1 l
- <style>0 ?" t$ [3 Z, l7 }5 [4 B3 |
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }2 `: w) q2 Y$ }0 w" n% v
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }) X# A- I# o9 b3 f2 N
- </style>
; ~; l* d5 v2 C+ ? - </head>7 R/ p& v2 ?3 j) `4 o
- <body>" N8 q9 J, N6 W; G( R& N
- <?php5 _4 U9 V2 i& t( K: R
- $BOMBED = array();
) H1 _/ h7 H( \5 ^ - RecursiveFolder($HOME);
1 p8 }% L! r6 f1 k - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';) L- u" }1 G6 G" X3 t7 ~0 u! M1 S
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }: G& r" R6 V }6 P7 p# {8 B1 f
- echo '</p>';( _6 i+ t" G0 Y& R3 W
- // 递归扫描* T/ j( B" E/ d* V4 ?& S5 {# d
- function RecursiveFolder($sHOME) {
: k1 ?6 `: o; E7 b# X+ v - global $BOMBED, $WIN;: p% Z. @8 g1 C. a
- $win32 = ($WIN == 1) ? "\" : "/";7 p. n( @- z' d8 x! _
- $folder = dir($sHOME);
: P, Q- e5 o4 U7 K, h: ~ - $foundfolders = array();/ c8 H7 V B* O5 j- t; }! u
- while ($file = $folder->read()) {3 Z" L& g4 ^% T# l0 C1 E4 T
- if($file != "." and $file != "..") {7 W; E, n4 h+ O5 D2 }
- if(filetype($sHOME . $win32 . $file) == "dir"){/ W, b6 K) F2 k) ?5 u+ f
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;9 c) W. f) r7 I" | a# M
- } else {. B+ K0 u3 ~( q2 d$ L7 ^: V
- $content = file_get_contents($sHOME . $win32 . $file);
1 l. Z8 \* |9 s - $BOM = SearchBOM($content);' @5 a% C" z k$ a% |! Y) B
- if ($BOM) {
8 V! Z3 j3 j1 V& E( _5 M9 X- C" a - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
2 I2 B. K% H' ^4 C& ^( k - // 移出BOM信息7 _6 a' o9 a3 W
- $content = substr($content,3);
& D/ C# {2 m1 w - // 写回到原始文件8 d# ?+ X( n; I- m# D3 w
- file_put_contents($sHOME . $win32 . $file, $content);
9 Z5 z$ {7 d2 K2 Y% s* p - }
5 c6 h7 k9 J/ t+ l$ R6 b - }
/ t% j$ L8 F5 y) [) B1 D - }9 M' w l$ H/ B6 x6 b
- }8 K7 ~" v( H+ ~ M6 `! L3 f
- $folder->close();
2 I" v1 i5 _, o9 J& k - if(count($foundfolders) > 0) {
1 @' Y' x, p' s- h" k9 X - foreach ($foundfolders as $folder) {
9 ]# Y" z9 x0 m* S. S+ `" F" ~& T - RecursiveFolder($folder, $win32);! [0 ?4 G" x8 z" c# B
- }
* b/ z6 Z, `5 x( `4 P7 I - }
V+ j* A* ?" E& D - }/ s$ ^3 w0 |0 H5 M
- // 搜索当前文件是否有BOM
5 v8 D4 S' F( t - function SearchBOM($string) {
' k$ k0 j9 q( e* B - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
7 j. w& N u5 Z' y7 z. m - return false;
1 @0 o6 B/ l/ e' E - }9 }3 X# k7 c+ h% A1 E4 p3 z, I8 P' @ @
- ?>0 o- R- B: |' ^( ~" P' M
- </body>
2 N h& f% I% R; O' B0 D - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!2 _& N; {# C# A4 G6 Q, m3 p
5 H, p) ]3 {$ N& p1 \3 H) a0 f# x
|