模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 ( {& m, O& S3 q L! U+ o" [/ b$ E
/ n1 C+ v: y$ b/ [这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
t9 ]9 \$ X. `$ I/ g& X( x* [: C
0 c/ M& S6 o% _0 G: V- L它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
% k' W2 ]6 U" B* ~
# p1 K+ G* K+ w3 v. ~% h" `对于一般的文件,这样并不会产生什么麻烦。' c& x: A* Q# i; y0 U9 k
' |* N+ `! K4 o7 c. B8 V但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。% K" \" T- z$ i: x6 H
" L+ B: }. v) V* n+ J
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
- c7 n. k8 Y; q! _4 h4 A" ?# C% W- d/ Q7 M7 t& w
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
1 w& q1 C7 w" [; z" f2 u+ p( a1 L4 d
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
( x8 d) t5 V5 z! p* v/ _0 [$ z" ^4 G l" i; A
然而文件比较多,又想偷懒下,使用下列方法来实现。 . P* U* M" V: [. K, Z9 S, P
* r3 k& `3 s& D! p# D e/ u
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
( f9 R+ d# o' D" ]" g+ y8 b& p% T9 @, S5 X4 {! z
" p# I; Z- H. f1 Y- <?php
8 s& D+ ]+ g6 F. _+ n - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)1 F* k/ W2 P y( ?+ E6 ~
- $HOME = dirname(__FILE__);
4 Y; d4 q3 F2 a - // 如果是Windows系统,修改为:$WIN = 1;
" x; ~4 i( v7 O+ n& p0 }; t2 z - $WIN = 0;
4 j* Z0 S6 l7 s" M* g$ b - ?>; d! q) k; G$ l" K4 e& @ h
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ \9 n7 k W" F' l9 M - <html xmlns="http://www.w3.org/1999/xhtml">
9 c3 [ v) X2 e& `0 A- o - <head>& b% ]5 I% h* C6 B, p
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />0 J6 {6 ^9 z o# r& u
- <title>UTF8 BOM 清除器</title>
! z2 O# e8 N* ?' R - <style>' M7 }" T; K3 _* ]2 Q
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
! a: N: |; q1 i% _% v - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }* Z7 a8 `1 K0 K7 U/ b
- </style>0 G; M0 I9 K% J# Z# c" a# G" Z, D
- </head>/ M) K3 R2 u1 g% i# ]5 F
- <body>2 Y3 J+ M, E7 Q* G
- <?php5 |+ ?( h- Q1 _
- $BOMBED = array();
8 p. H- s8 |' w - RecursiveFolder($HOME);! X$ j. C; Y) N0 V; l9 b+ X: `, g
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';6 t8 `( \0 h4 L" T" T5 X' I
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
' \7 e2 x& a4 q7 E& ] - echo '</p>';0 A% q( |1 [+ d! G( U& V9 }
- // 递归扫描
8 N" c9 m+ T$ G5 y% b - function RecursiveFolder($sHOME) {
+ t3 N7 E$ V6 G - global $BOMBED, $WIN;
6 D7 s& i. H7 F& x2 x$ A% R" U - $win32 = ($WIN == 1) ? "\" : "/";
: T$ k8 W" k7 ?0 T2 g8 ?9 B - $folder = dir($sHOME);* v/ q* L$ \' l" Q
- $foundfolders = array();! o+ w9 T3 o x7 G: C. q
- while ($file = $folder->read()) {5 {' U/ \( [0 `+ H, G9 I1 y
- if($file != "." and $file != "..") {
+ J' X' C! J7 Y, | - if(filetype($sHOME . $win32 . $file) == "dir"){2 U$ G& A3 T& {5 H
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
) X# C W2 o) W0 n, K9 q3 o - } else {
7 O1 Q. f: w, a! {& U3 i9 c - $content = file_get_contents($sHOME . $win32 . $file);% k9 W7 [ i. J' i8 x9 c
- $BOM = SearchBOM($content);
. d8 ]. m/ \$ g0 L- y - if ($BOM) {4 j& Y" b- _4 z- D6 B! c
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
( z! w* j5 S) _* T' d) N - // 移出BOM信息: Y3 q% H+ O7 b. B- ]
- $content = substr($content,3); l" E: G# [/ d. o3 }2 |' G V
- // 写回到原始文件% [: t& |0 m: P' S: ^6 A3 p- A
- file_put_contents($sHOME . $win32 . $file, $content);
" [% K w; v! V' @2 \ - }
& x+ M+ N$ P) p$ Z4 T6 j- K - }
8 I2 M2 p: Z- m a6 z* E' @ - }
M+ R& X1 }5 L - } M5 t5 d$ b% ]3 d) p
- $folder->close();- n& y" s8 t4 l
- if(count($foundfolders) > 0) {0 {8 x" X8 s/ }) w
- foreach ($foundfolders as $folder) {' e; V- j3 g7 T" U6 [, p
- RecursiveFolder($folder, $win32);6 x* C% f$ Y+ q/ x, V4 Q# H
- }7 X& J. @7 p: v" |& J7 f
- }4 \( U3 A! B9 Z! _9 [, t
- }
/ ]& [6 B) j2 a) k - // 搜索当前文件是否有BOM* ~, k/ c5 T; H& A
- function SearchBOM($string) {
/ _) m2 G* F* H0 ?+ p: C7 @ - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true; Q8 y6 H- z) M3 g) m
- return false;
( N3 O C( M: \' |! r/ I - }
7 ]+ |$ ?9 l6 T& J4 {' D/ m - ?>
6 a' w+ m2 _' n' T - </body>
! [+ |( L% ]' s - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!9 [: Q# J" D9 V; \2 R& m
8 t3 A2 d' D3 y3 t( T |