模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 % Y6 t5 Y+ E0 }% ]( M! k. q
' o' }+ p* |; h7 |
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。" x- U) n+ x E6 l4 C3 i# D
3 M* t# q* ?$ Z; _+ M M" w: _它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
R4 ^3 }! f4 U5 P( p$ H: L; N9 f4 S+ i" b2 |0 c" T% u
对于一般的文件,这样并不会产生什么麻烦。
7 F' i" l2 p. L8 T. c
6 n: [. z9 s" V0 K8 O& N- h但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。3 _; y0 G( H/ ~& q3 U6 R$ S
/ ]$ c: ^6 \$ \7 w根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
9 ^! U# ^# c8 k5 g9 o" M4 U9 @6 y/ T) f# A$ |
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
* q5 c7 v$ G1 K, K* |3 N1 _% B: A3 R% A5 e! E2 `: J& g
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
, h9 @1 @0 P! }1 m$ d& `: W L0 E
! U. B/ E8 B8 B$ p: z. } ^然而文件比较多,又想偷懒下,使用下列方法来实现。
5 m. m* O; m8 T. S$ C+ N* q* Z
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
1 h, T! n( [: H% H" w% T
5 L; _8 E: C4 ~5 s. Q+ j- g0 r; Q- d+ e1 w
- <?php
2 m# P4 S, c6 c4 y2 f' N - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)4 p5 o$ ? L h' V$ G
- $HOME = dirname(__FILE__);8 |' S# ~2 V+ m8 j
- // 如果是Windows系统,修改为:$WIN = 1;
* r- ^7 ^) R* Y# x/ E5 q - $WIN = 0;/ y B6 z$ e; e9 f
- ?>. k* D- a! T( u" F" W$ D w
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 {/ m ~4 z4 e: e9 j
- <html xmlns="http://www.w3.org/1999/xhtml">8 u6 [3 o, _! c2 f/ Z0 n
- <head>
% `( _( ]5 b5 A& O# u! J$ R - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
" A, y1 W" Q" Q1 u - <title>UTF8 BOM 清除器</title>$ y3 g/ A& _' t4 n, I
- <style>! i# a3 v L( K3 } ^; x
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }7 ?) q7 N/ o; }9 E
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
! V, u* p) n) k( a- n2 F - </style>; I0 w% O v" \; J9 ?$ N2 M6 `+ { f2 Z
- </head>
: Y( S" r) w% w y | - <body>
' Q4 X( ? F5 h( C1 w4 S# [3 n5 C - <?php
9 B; B9 y+ _. S' C) [" D# V3 y$ z - $BOMBED = array();
5 @- o7 Z8 J4 P5 `$ u, ] - RecursiveFolder($HOME);9 Y- q$ b6 Z* g1 O
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
7 }5 F$ _' A, `9 x7 k - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
- A" l! ~* U( R' R5 {$ N% d5 Q - echo '</p>';
7 R- j" M9 o* ^% v5 U - // 递归扫描- N5 N, T0 Y* s. [. F) }4 b4 S# r
- function RecursiveFolder($sHOME) {
. V0 m8 X- k4 T) s7 ?! y; S- ] - global $BOMBED, $WIN;3 H& Q$ y X+ w' b9 R" o: i
- $win32 = ($WIN == 1) ? "\" : "/";0 _. D3 ]7 g$ D+ g/ ?: r+ j
- $folder = dir($sHOME);
a/ A1 {0 o) x) n - $foundfolders = array();( d* g u* K8 d3 P
- while ($file = $folder->read()) {4 U" H7 O' c$ ~$ I+ `
- if($file != "." and $file != "..") {
' r B( f- y8 o - if(filetype($sHOME . $win32 . $file) == "dir"){
- N! g4 P) E. M8 [* } - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;5 p6 p* O: r E( A! j& r
- } else {
0 }# d( o( S% K" m& Z - $content = file_get_contents($sHOME . $win32 . $file);3 [% H# K0 M* f/ h3 L
- $BOM = SearchBOM($content);7 J1 e/ q2 v, U/ F% J0 j, N
- if ($BOM) {
1 Y4 t2 k( v. ^0 I' m7 r& n - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
8 r# r( v% K4 Z2 K' v U0 S/ Y3 x - // 移出BOM信息
- _ c+ n8 B+ J - $content = substr($content,3);6 a' C4 {+ r" p6 F9 G9 t
- // 写回到原始文件- j8 u2 \+ X8 T9 d% Q
- file_put_contents($sHOME . $win32 . $file, $content);
$ U' Y* N) p& N: i - }3 Y2 n, d1 a$ |. `0 ?* w% ?& Y) r
- }4 q, F9 n/ I# l
- }
3 A5 p c8 A0 K9 G3 C6 K( D: k! T% S - }
; s$ v; t8 [" F7 z, H% K. } - $folder->close();# f1 c& K) p5 j; H3 m: P. K
- if(count($foundfolders) > 0) {- A6 t: ~ a) M1 u
- foreach ($foundfolders as $folder) {( a. c8 u2 C6 q' f5 a* k8 [
- RecursiveFolder($folder, $win32);) H/ W# j3 x/ b8 g5 d* A0 k
- }
/ ~1 F2 a6 V; A( N0 m( Z - }4 {/ M# \7 Q5 Y
- }
( ^1 ^ i, U) ` - // 搜索当前文件是否有BOM$ N& L" I- [' B; n/ h0 o
- function SearchBOM($string) {
% q2 {+ k) [% N) Y/ r1 |1 I - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
4 g* [* U0 M: F- o; W! R& V6 m. u7 O - return false;
- U, ~" w; o$ D; o; I - }
: A0 n# Z8 T3 |! V; g/ |& J& M - ?>
5 N, C( t' |* z; O. P6 m) r3 S4 h - </body>* U7 q% ^% @8 s8 [7 X$ U. S( ?
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!; \# I$ S% N- H8 |6 q
7 V m% m4 n W. n1 T) J
|