模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 / ^/ R( j. g4 b, A9 |2 k
( A# C2 l6 h( s8 n4 D# a, \. i. B
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。% d% l) x, s4 X, S3 [
& r) {2 a% i! i. S6 S; V3 J6 c7 C它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
; B1 ]' a `3 g; |2 Y: M" O" Q% ^6 n8 X, D+ J
对于一般的文件,这样并不会产生什么麻烦。
+ {. o; d) D+ O; O/ C5 N
" I- a8 d1 k* ^- K5 ^' u. O但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。' T* w! F* k' A4 Y
* H6 [' j Y( d" b
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。7 B; _+ G9 S- F- R1 @" l1 A1 r
+ n9 n7 i1 J3 w. K' [3 l' n+ _由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!+ P1 q+ m- i* j
% [1 c1 s8 h0 ?5 ]5 l8 ^6 b# [直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) & g2 Y) N- k2 j d4 r
" \* Y$ q1 Y$ X1 H% ^$ D) l然而文件比较多,又想偷懒下,使用下列方法来实现。
% ]; g+ n' f) G9 j" G& K5 R% e& ]4 O1 W1 A
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换2 j4 G* _: j9 |
- B. ~( u4 \- k T
7 j) c, x- t: h0 s6 m# V* f& D
- <?php
( ~# R, [# K2 E- P' o) \% t - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)7 i! l X( Z1 ^& ^
- $HOME = dirname(__FILE__);* E7 ]; ?: \9 @& W
- // 如果是Windows系统,修改为:$WIN = 1;$ B9 V4 f" t! ]2 \4 o3 ~" J i! v
- $WIN = 0;
% f; l8 [, {' X# Z6 s - ?>
; n* \: H; B+ {) X; L# V/ o - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
, F$ x) z1 V5 ~$ \ W) b& J - <html xmlns="http://www.w3.org/1999/xhtml">- P5 s, l: a% a2 ]
- <head>
& k4 q- L0 P7 r! r p1 k6 ~ - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
$ d0 _. u! o; J9 k - <title>UTF8 BOM 清除器</title>
6 ]. r0 j6 v, Q9 S - <style>
3 b* G$ _4 l$ ?, b( H - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }! J& o6 o: z( Z" |
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
9 f3 i. L6 I! G4 d$ d - </style>& v1 G/ I: k4 W/ h
- </head>$ ~1 U/ g5 P3 \# N
- <body>
: H# y+ [: i E9 Y2 t6 y* I1 A% `7 z - <?php
5 y4 z" N) ~+ S; O* T7 b - $BOMBED = array();
: v( R1 G4 N- _7 T - RecursiveFolder($HOME);
2 d7 I k% Z9 l# l- m. U3 ?3 M - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
& ^: i% N+ K; d* ?" L" i% {9 j2 @ - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }7 ] z7 [; I+ n J9 y0 H
- echo '</p>';1 C8 S- m2 w& z/ A! @
- // 递归扫描
7 b* u6 J8 u# W1 I( ^1 F - function RecursiveFolder($sHOME) {
3 \8 Q1 l- F8 Q2 c1 q8 c - global $BOMBED, $WIN;
5 O9 C9 @' B$ g5 e - $win32 = ($WIN == 1) ? "\" : "/";
! n7 x+ W# P/ O - $folder = dir($sHOME);+ ~" [; B) y+ q' y* v. g7 ]; K* S
- $foundfolders = array();
8 h; p1 e z$ D; C4 M: ^ - while ($file = $folder->read()) {
2 O% P0 _7 Z* b8 V* O% ~ - if($file != "." and $file != "..") {
; H5 h) b) N/ W4 `! w+ O+ |* x. f; W - if(filetype($sHOME . $win32 . $file) == "dir"){5 u! }4 Z( Q' V5 |
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file; @4 T" V) C" V' g7 a- r Z) [, I
- } else {& \' p) F& W/ \& _) }8 P( t8 C) _
- $content = file_get_contents($sHOME . $win32 . $file);
: i. g: ]+ E2 v" @) @" S - $BOM = SearchBOM($content); `$ } Z! c' |" W/ V* D
- if ($BOM) {
2 ^' O( W0 m* q- E0 g7 [! s4 K3 x - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
7 D3 N, l N1 Q, Q, r/ M: |6 E* u - // 移出BOM信息& g7 \ Z" i$ z* ~* R/ M
- $content = substr($content,3);
+ j* i9 _0 F3 { - // 写回到原始文件5 U$ O4 K& E% c
- file_put_contents($sHOME . $win32 . $file, $content); h! s/ A7 p7 @7 l G! F
- }; s2 O! A8 a% |
- }1 V( y, {/ v2 C$ ^" K) G
- }) ^6 n! B/ h# O
- }4 m3 ~# u# u+ `* {
- $folder->close();
" P P+ G. ?( x* C - if(count($foundfolders) > 0) {
; @ a# |' d- V- j0 H - foreach ($foundfolders as $folder) {
6 U; c) ~6 N/ L5 _* u - RecursiveFolder($folder, $win32);0 B4 T& V! @: ?& [* H. f
- }
" c) E) {/ \& n; z' U, n" U - } L# I. j' q8 n! w* w
- }
: H& S) n [ N, s+ b. v - // 搜索当前文件是否有BOM" M# [$ y5 i3 S" d
- function SearchBOM($string) {
; A) d* \8 }& r - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;$ j- k( h8 r9 h% u7 X* O5 j; z' B
- return false;
" U! e" T( G% D( e - }3 p3 e" ]6 S6 [" Q# X. X5 u
- ?>
3 s( K9 u% F6 I/ v P. g' z/ W - </body>
1 i' Y: _% M* K& \$ r: \4 @ - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!; G6 l! o* @% [' u0 c
U: S3 G- h* I% w& ^5 H, p |