模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 6 u# ]( G1 \( P$ R" Q
9 K5 w0 E4 f$ K( a$ `- u这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
; ^* [% t7 Z$ m- b% U% L# z2 I
* r1 L- Q7 {/ b& e4 c0 R( \它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。: x( F2 H$ O8 V
. P' q: O: v* ]0 m
对于一般的文件,这样并不会产生什么麻烦。+ p' D% Q7 {& g" c* l
6 p0 f5 B( @# |! E, s但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。2 {; e4 E# r- g8 M$ K
# \2 U" v, @$ A% E: q9 d根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。5 d) X! V) _: W* s& p
7 m' h$ k5 m9 a6 ^由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!* \; f+ W5 x( ?! S( f/ a3 M4 M$ V' d
$ ^* z% j! k. z
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) / d4 @2 L9 c/ _/ n- H \- I- k
/ X( B0 z, |5 u {
然而文件比较多,又想偷懒下,使用下列方法来实现。 2 z: w; _6 ?$ f7 Y! q
* m- h: Q" a2 W F: C将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
; |5 `7 W, w5 O5 M# J) A% y; Q/ ?- }- i6 U1 j& h! `
! M0 i9 e$ f$ i! a9 e
- <?php
6 S$ C$ Z. b5 E - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
* b+ Y' }9 {2 C% {( ]7 v - $HOME = dirname(__FILE__);
5 ~. ]6 {# i/ m9 U7 Q( V% O - // 如果是Windows系统,修改为:$WIN = 1;
7 s# y+ _; p6 P) n - $WIN = 0;, Z$ K5 S% g5 \" B+ j
- ?>
% q" `/ u0 l5 Q- P5 v) x4 M5 C3 @; s - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
) @2 n3 [1 \. a" T# H - <html xmlns="http://www.w3.org/1999/xhtml">' q8 H: t$ x+ |) @. W+ j0 _) i9 X
- <head>5 a2 b! Y" f% K' q J8 Q9 P+ H7 Z
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />/ k' e! H8 m+ ~4 n- H$ ]! y7 `( p
- <title>UTF8 BOM 清除器</title>- u( ` V* A9 ~. j) V4 L
- <style># _* j9 d4 \- z
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
) _. b0 h# }7 u1 t# a# F - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 L2 U7 U0 r9 t2 N; M6 b* d
- </style>
3 z& q' l- S$ W, ^. ?/ a1 o0 G N - </head>& |0 J& E- L5 m( g L1 T" |" W9 o
- <body>
" r# Q# y7 E9 E% T, b2 b - <?php
2 Y" z- s% q6 O - $BOMBED = array();
7 U8 L/ m: ]9 K - RecursiveFolder($HOME);1 L4 Q* j6 a$ q4 `
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';: R; \/ @( F P7 n( i. W0 Y+ y
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }* R& D: L! w- A5 R1 H. @' k
- echo '</p>';
+ w! s! T: K& k' M2 F - // 递归扫描, a( q5 C8 j, {5 y0 D) A$ Q
- function RecursiveFolder($sHOME) {
; L6 a4 i, Z3 @% |9 F4 H - global $BOMBED, $WIN;6 t, X% ?# A) U$ `: t
- $win32 = ($WIN == 1) ? "\" : "/";1 w" u0 f# o6 `) S3 @0 O/ O( }
- $folder = dir($sHOME);
2 f. H4 m: R7 N: s! D/ G - $foundfolders = array();/ x& A; A4 |7 g; ~, `& X
- while ($file = $folder->read()) {1 c% x7 j/ q: V$ J$ V
- if($file != "." and $file != "..") {5 f4 y B2 }4 Q: v2 z5 w
- if(filetype($sHOME . $win32 . $file) == "dir"){7 l$ M1 G3 ~3 J
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;# u; ~1 B- T! y# ^
- } else {
. w8 G7 T# G6 n$ R0 p9 C - $content = file_get_contents($sHOME . $win32 . $file);! V# E' F+ A: C5 H8 c
- $BOM = SearchBOM($content);
8 x! z$ q$ K* d: H: q/ i6 G6 N - if ($BOM) {
, i5 L: k! c9 A/ o - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
" z* Z( k# {8 ?# ~ - // 移出BOM信息5 I% I4 p' i+ H3 v, @
- $content = substr($content,3);
/ t* q$ o2 W( ] K - // 写回到原始文件
+ T- H+ Q: V' X. V( }$ @ - file_put_contents($sHOME . $win32 . $file, $content);
' F: O1 l* b4 `; }5 X$ t; u+ |) r6 g5 X- h - }
1 Z# M) I. Q" x) L4 i4 M - }
+ I" k. Z" Z3 T0 l) J - }6 ^9 @! T$ E0 \2 @, Q* i
- }
) ]0 ]0 D' O+ H- f9 Z7 U% J7 s - $folder->close();
- N8 G; X5 n. T3 v% Q+ S - if(count($foundfolders) > 0) {/ T* o+ K+ e# \3 m( {
- foreach ($foundfolders as $folder) {6 |9 W K* i' o6 q. K. c- I
- RecursiveFolder($folder, $win32);
7 ] A! ^$ D2 J8 J# y - }2 V N5 G* Z& ?! ~6 ], C7 H! n
- }$ T$ G$ _9 e( j
- }
( }9 m6 U; u0 g& I1 K7 I - // 搜索当前文件是否有BOM" x6 s! \6 N/ m1 B" s
- function SearchBOM($string) {
, a& I9 h# z5 R! c" K - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 x2 e: h$ O: r. h! M3 R: j! f _+ N
- return false;
3 z4 t2 ~! x* u, I - }" x: V5 X; X; q. z H
- ?>; h/ M7 q0 S; Y, r0 I9 J1 m
- </body>
" w! Z2 r; c! c9 i; {1 \ - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
2 n- X$ e: I* z9 S% B1 k# n6 x( z( `2 `6 S! M; u! u% d+ J$ F
|