模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
7 L. S- n, _& _8 ?7 ?& L9 z. T
4 J0 z) r! x9 M. F, C2 w这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。( u2 J% M! _! b' P# u$ n; R
8 Y% g; o* n: ^# E
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。3 E$ v1 R! `( _1 m
/ c' A9 y5 ]. B对于一般的文件,这样并不会产生什么麻烦。. C; h9 V0 X0 Z$ }
3 n% [& U0 U1 F$ d) R E+ O
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
2 N9 E3 ?9 U, m4 a+ Y% }
% E+ ~- l' P6 ]根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。' w6 G* L) E7 f" k7 z- h
$ S8 C- l' u6 I8 O0 p. J9 B
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
( ^+ r: {5 ^0 s
/ J4 D9 e, h5 G5 C0 Y( }% |# ?! i直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) . Z) X7 U& A1 n( z
' @$ l) }" j: x7 {2 D8 \( {
然而文件比较多,又想偷懒下,使用下列方法来实现。
6 s# ?0 }& i* {( Q6 X2 b0 |- V
; j( J2 D9 W# o8 d i将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换, i6 m+ G3 o* _3 A
* N2 Q3 M/ ]% F ?) c- W4 w
, F7 r" l6 A6 L
- <?php & ]* | x" m. S5 t3 H
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)' V0 D, P7 Q+ x9 D' v+ u
- $HOME = dirname(__FILE__); O$ t: p) s, [& u& ~
- // 如果是Windows系统,修改为:$WIN = 1;
) w) f( }' C9 |! B& K5 W - $WIN = 0;7 {, P9 U/ B8 }4 L* I2 Z
- ?>
( S# g: t: x" d8 E' o/ n+ L - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">* P: r3 A1 B+ R0 k5 a
- <html xmlns="http://www.w3.org/1999/xhtml">
& g3 v3 T% L$ G! D Y - <head>9 F3 S* s* X+ g6 M- A1 C5 j
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
! {$ w1 O5 O. ~ - <title>UTF8 BOM 清除器</title>
, c2 L! q8 Z8 u, C& n i - <style>
$ u1 {+ f8 n, T. G5 z/ K/ g; V - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
' a5 d% a* `& S5 h3 {7 e, n - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }4 s, w2 c& |* L5 O
- </style>! ^; }! r% G: ?( @6 _2 j
- </head>6 N! l Z3 S+ {1 h
- <body>: b" T' k: w+ |2 H$ b
- <?php
8 K* y- u3 [8 z& k, W0 E - $BOMBED = array();* v. U- X& P1 O" K1 C
- RecursiveFolder($HOME);
6 U4 ]$ D" t) \$ V - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';/ a, ]5 Y y% }& |# p& M0 v8 M
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }/ Y) O3 o- ?( l5 C
- echo '</p>';
$ U# x" c3 Q9 h: V# C2 W - // 递归扫描
( o3 ~, y1 B$ h' ~ - function RecursiveFolder($sHOME) {
0 n/ I; v; Z$ U; P$ W6 v! S - global $BOMBED, $WIN;
2 u& X" q6 @4 a! d - $win32 = ($WIN == 1) ? "\" : "/";3 x$ O3 `" b+ X- |
- $folder = dir($sHOME);
: ~ e. m6 [2 X) r7 a, U* O - $foundfolders = array();
1 u' I1 r, T% ~! F1 p8 Q7 ]! } - while ($file = $folder->read()) {- {9 X; e6 {6 D0 p+ E* d- W
- if($file != "." and $file != "..") {
& {5 L# Z( e# `7 e2 f - if(filetype($sHOME . $win32 . $file) == "dir"){: O( x7 g% W. z, z) v
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
+ `$ \7 c# l8 k/ y* i# [9 L9 B) I - } else {# }- s$ o( L: ], \4 ^5 W" z4 X
- $content = file_get_contents($sHOME . $win32 . $file);
! l8 F$ ~! e8 }2 W; o- o - $BOM = SearchBOM($content);) A& d1 T1 c4 h- w
- if ($BOM) {
; R+ z6 I4 h K7 Q% p% T - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;4 p$ i% \7 R2 v% U8 e, d# e" J; v8 R$ g
- // 移出BOM信息
/ F3 ^" P& u$ o6 p* f# L7 M - $content = substr($content,3);7 q; E+ Y: ?3 l! c1 f1 b& Y
- // 写回到原始文件
: p: ~. b9 f/ Y* z& h1 x0 s M7 p - file_put_contents($sHOME . $win32 . $file, $content);
/ g# J* F" v. d. M - }
5 k, V+ ~' @% @* T" a* P) e& G3 R - }
- w9 M% C2 B; V4 A - }
" r, B6 M" Q( H0 ^9 V' I9 O0 y - }
$ @1 ^5 p$ h! D. f+ S' d! E - $folder->close();
9 B' m6 U3 f3 a9 _& h - if(count($foundfolders) > 0) {' `. B( O' e' G) v$ M
- foreach ($foundfolders as $folder) {
% h9 H- Z; w/ j# N0 y - RecursiveFolder($folder, $win32);, c% q3 w4 P9 \& {2 m2 K2 F
- }: {* \3 |# n, E r9 g# R
- }
, d( r6 s' z+ u8 R - }3 {( b. P' c/ V" y/ q
- // 搜索当前文件是否有BOM
- r4 D. T2 ?+ `* V - function SearchBOM($string) {
! K: a4 |6 f% @3 z @ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
$ @) U- O& O8 r3 Y4 o - return false;
6 M6 p8 I' H0 `. F8 ? - }& J3 Z9 b- A: _
- ?>
, U+ M" g( D S. H6 b \2 f, W - </body>
. J. g9 ]; J9 ? - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
9 z# y2 C ~' k; _/ J4 i0 t
a; S7 q6 L" U8 t1 _ |