模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
" X4 \) V5 v# A1 e# q9 r/ J" g n5 v9 N# ?% g
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。7 A% F# B1 [0 i, o( F
3 V; w" F, R* E. N, m0 U7 b1 b% ]它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
" w$ D; Y3 o' y; j! |2 B- A7 {+ ~( {+ x" m( ]5 d" T. O; p9 u
对于一般的文件,这样并不会产生什么麻烦。
4 U. q' @- X! F- L8 z- o' K" [ P) F) u" O; A+ p
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
7 @3 G" V. [: I6 G. @- @# }+ ?
. l; v# d. r5 L: h根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 h$ {- j5 G8 y/ [/ ?: K9 N
( Z3 @3 M/ v. a. I J3 I由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!; [' s" P; R' H3 L0 d c
$ `. U! W; S) n8 R% ]! [" g v4 j
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 2 A5 Z1 d. [2 g# w+ }
; U4 w$ J# S( ]9 E3 D2 }
然而文件比较多,又想偷懒下,使用下列方法来实现。
$ m, l6 ?3 T( G
4 k+ `! o' H# x' h' D将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
) g- W, I8 L: Q% O: ^% W5 Z+ q% }: f
6 `2 j4 }/ {+ Y
- <?php , L6 I: W9 ^: x {1 G0 y0 Y: |
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
0 [; L2 e- d# P: Q: l - $HOME = dirname(__FILE__);8 [4 }+ N* j' K: {
- // 如果是Windows系统,修改为:$WIN = 1;
; Z( t0 p- k8 H: e" I - $WIN = 0;" g/ m% v4 x ^4 M0 L! X5 z
- ?>/ f, L$ I: z; ?3 |5 A) L% I0 _
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) e2 m6 b! {2 ^/ R/ a) r
- <html xmlns="http://www.w3.org/1999/xhtml">
- [- v5 [$ w/ N6 E# X - <head>/ v' U% l! ]6 W
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
3 F: I# H& x' m* k z - <title>UTF8 BOM 清除器</title>8 O# F6 b. @0 g$ y, O: ]; @
- <style>( w% b6 B) d. y
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }$ g) Z% t( N$ Y2 E$ N# _) |
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 W( O- ]! m0 D# o) u) [7 @0 L
- </style>
( O! `3 g5 z# }6 [7 E: y3 r1 b - </head>
7 K# b3 }" j% t3 j - <body>
% n1 t( R' O+ \ - <?php, f3 p( `- A( K5 a% ~. i
- $BOMBED = array();4 d/ O& {% f7 v0 [$ C/ w6 }
- RecursiveFolder($HOME);
% }: U+ Y8 v" w, f" O: i - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';7 P/ m, |2 } [+ a R; D
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }7 N C- E" f( L7 _
- echo '</p>';6 \4 w0 d) H7 ^) o# |/ @$ y% Z) A
- // 递归扫描
* j, ~# n9 y6 |2 y9 ~, L" m - function RecursiveFolder($sHOME) {: B5 m! n' `0 G& t! }4 C' E0 {
- global $BOMBED, $WIN;8 R% W' F$ G2 `3 D+ s+ G( B
- $win32 = ($WIN == 1) ? "\" : "/";
2 a) d: S# U; M9 x @4 _ - $folder = dir($sHOME);
d0 f) V, {7 |; K- k - $foundfolders = array();9 M1 Q4 y" P) n5 X. u
- while ($file = $folder->read()) {
& E) ~* _1 ^. ?2 ~9 y - if($file != "." and $file != "..") {) \4 R3 x3 f3 H3 H" \5 x! H
- if(filetype($sHOME . $win32 . $file) == "dir"){
" S; ?6 K! t; ~) h - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
1 y# F4 q9 J z8 M/ S& V3 B - } else {1 j* k1 L% O* W
- $content = file_get_contents($sHOME . $win32 . $file);
9 |# n% l; W4 e4 x0 x; w' s( H4 P - $BOM = SearchBOM($content);0 a3 k6 k- E k# `. ?0 R) y9 F
- if ($BOM) {
! B; o) h4 N6 Q! b$ N" U* X* M - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;5 e4 O4 r/ Q6 i0 R* b1 F
- // 移出BOM信息
% [3 M" W$ J- T6 | - $content = substr($content,3);
, z' W% b. S- G3 j* k - // 写回到原始文件
/ L4 z1 P" I& J6 a! ` - file_put_contents($sHOME . $win32 . $file, $content);, q" H* S9 t% g
- }
( q; U3 b8 y9 X$ Y% R5 w - }- D$ I6 D w/ q; r- t
- }
, M& n) V$ y+ H) i1 y% M - }, \$ ?2 ^2 h$ B" s
- $folder->close();
$ h/ a; x+ s0 L$ B5 A7 W - if(count($foundfolders) > 0) {
$ }$ z# i c6 X9 o9 y4 z - foreach ($foundfolders as $folder) {1 [# P+ r2 @2 [6 J, h P: n, _
- RecursiveFolder($folder, $win32);
. O& n0 w# _" m, ^3 S \2 R7 b - }0 b7 ~5 {+ l% F3 l
- }
7 a+ K7 b% C* {( @ - }; w& ]7 c' a% u, g- g
- // 搜索当前文件是否有BOM
8 \; _1 }: L5 `/ g/ z/ ~ - function SearchBOM($string) {
, R- K2 P$ ~8 I( K! p; E# V5 I# ` - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;0 |( V& r+ }% R7 i) R% D; s3 D
- return false; % N+ S6 P! a& n% q
- }
/ t* S, K1 y" J+ z - ?>
2 _! r5 R5 ~( \/ X1 p: _ - </body># O4 E# `' Y+ F8 z% }; `
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!% _* i$ Z- ?8 c2 a/ }
0 ^+ C) Q8 l$ j& @6 e. q6 f
|