模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
/ C; l( P9 h% k) o( B- s, A% I; p w- B+ g
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。# ~3 w+ V1 {, M* a$ t& K
! r3 L$ L7 }5 s' i( ]! J它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。# n) l& o5 T7 D9 C: @
' B* i/ v1 S) B/ G对于一般的文件,这样并不会产生什么麻烦。9 P7 W; E4 b1 s
- w# Z/ l6 E/ b但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
9 `: D; c6 m) t; m: u4 ^+ t B& L
" a) _# W9 M9 O2 U+ [, g8 S/ W" t! P根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。% y; e% r) ^3 A; U# P: t
( ]6 Y# O+ W& S: k( Y
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!+ @& [3 D2 z$ Q- @. D# l i
5 \6 o- H$ V2 i0 @, h1 N直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 7 A1 ~; R" ~* d" K
1 ~) _5 `8 w5 s7 g: [8 c) P然而文件比较多,又想偷懒下,使用下列方法来实现。 ) N4 b( H: ?# s1 f
( X+ d6 v) d% L( O
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
& q9 L+ o1 p6 i8 ]0 c
; L' A9 B: n8 q+ X' N& L" r3 J# v8 [( r$ U
- <?php
* Z/ ?, R1 k j3 b; ]3 c! w: ] - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)) w2 j" R" X7 K/ L( {8 L/ ]
- $HOME = dirname(__FILE__);* B! ^7 P% v% w
- // 如果是Windows系统,修改为:$WIN = 1;! q2 ~! k( @/ f' j
- $WIN = 0;! U% R# o. B7 ~) }! o
- ?>3 c6 C3 x. A+ f& M: r* u" |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">( ^) ~1 h, |$ @3 o0 d# q1 Y% ]
- <html xmlns="http://www.w3.org/1999/xhtml">
3 L3 |' \6 d1 [# U, l1 [ - <head>7 z" r( X5 r2 y5 l4 g
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 Z" L* x, n O" R0 r: p9 x* ~ - <title>UTF8 BOM 清除器</title>1 M3 ^% j; U' A( Z4 M
- <style>. m- m1 L! i3 q+ x- B5 h
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }4 g6 t8 l' A" m7 F4 j3 _! B8 ], }
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
! b- i6 d8 s: X6 O: s. _8 s - </style>) `2 F7 C& ~1 A: X) \! b$ n- Q) |
- </head>
, N! Y( t1 G* p; I2 p" D - <body>5 F5 R* ?# T" `0 B- H
- <?php
3 h; S5 m! @. C( U0 I6 E - $BOMBED = array();7 ?1 x) a! y2 R8 U( l
- RecursiveFolder($HOME);
, g6 L( J( q+ f: o' y1 t - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';1 V q! J- `% }9 M
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
% ]# s0 T( z% [6 h! [ - echo '</p>';% U0 `7 z4 ^$ [' |; B$ }
- // 递归扫描
: j1 q- S! J& _8 v' e# S' R r - function RecursiveFolder($sHOME) {
- ^6 k$ J7 C ~; V - global $BOMBED, $WIN;
; S# T7 X2 {( ]- h$ F - $win32 = ($WIN == 1) ? "\" : "/";9 b: Q. p/ M: F' X3 i
- $folder = dir($sHOME);, {% y+ r' K b2 ?
- $foundfolders = array();
t* T" p0 i0 [% V$ [# L" f - while ($file = $folder->read()) {7 b: `: R3 T% ~5 C2 T5 g; S
- if($file != "." and $file != "..") {
& H: p1 k, ?9 Y. _! w: e, e - if(filetype($sHOME . $win32 . $file) == "dir"){
% n$ ~/ y. g2 m, k; Z - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;; g6 @- h$ Q5 B8 b. f$ R- b
- } else {, K9 `" V+ S( n& E: [& G9 K
- $content = file_get_contents($sHOME . $win32 . $file);+ g$ v% P9 m- |& j5 }7 s$ Y
- $BOM = SearchBOM($content);
7 N% t6 |! _% p/ i - if ($BOM) {
: e, N: `& G: H - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;* p9 m7 F" e8 D( q
- // 移出BOM信息
+ P0 F# F1 v, X _7 q, p" K - $content = substr($content,3);# k+ G$ a7 Q0 ?6 N: N2 T- n0 `& L0 Q/ ?, H
- // 写回到原始文件/ O+ \. ?& n9 h5 p
- file_put_contents($sHOME . $win32 . $file, $content);
# j O* p6 y5 K% W# M - }7 g! T8 E( z, `8 V+ E, {8 ^2 e) ]
- }9 B" h1 g/ @8 v9 b w
- }$ B6 f3 w M, |0 n* x/ C
- } Y3 i5 o$ n1 o5 {( T9 h* X
- $folder->close();
* f( m+ d v5 R7 _* { - if(count($foundfolders) > 0) {
1 `9 d ?3 ?" @% ^+ B2 t - foreach ($foundfolders as $folder) {
$ b t) S/ S2 S g s8 X. X5 s8 n - RecursiveFolder($folder, $win32);
8 s1 c- r' G/ t. ]9 W6 G+ Q$ M - }- ]& |- x3 C4 x9 T1 f
- }2 d7 m C$ Z- h$ X- F8 k" B
- }
7 @+ \: z( Z* {# c* S' w - // 搜索当前文件是否有BOM4 V1 w; E b+ P, Y
- function SearchBOM($string) { & h( j# R. q% u( Y
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
) x' ]7 f$ o: Q. A- }% T' N - return false;
: K M$ I3 F |5 M; T - }
' k' A- d4 |7 [) m - ?>7 c6 U1 [& y q3 f Y- ^$ _
- </body>. x' d0 v5 G% Y- y. @- s
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!2 J$ S) ^7 ?, j4 g. N6 k
: `, K) q3 M9 u& t; _
|