模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
1 u, W% I$ b3 Z1 {% w3 q6 q. ~. Q& O2 T [5 R
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
7 E( p& ^) J y5 N# `. E. I1 v5 n8 P, a O& F1 q& [- b
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! d4 V2 X! |% u. G* n s5 ]
) Z4 {* c9 r# w1 N: @5 |, `
对于一般的文件,这样并不会产生什么麻烦。' f+ ^* R9 q8 k
/ L( a4 \% X- e3 Y但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。1 U# }; ?; `' t+ T4 {/ Z/ P) P2 ]
9 B) w# H' L* ~) q* M8 ?根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
2 I9 y+ g, O' L3 B- N) v7 W
" t4 m1 W1 v" l0 c) S/ ~由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!& A. X& E4 ]7 @" G5 q' K( a5 F R6 B
, B8 Z' o" S- E- o直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) 9 P- x6 b7 Q/ l9 D, \
# C) [5 q4 i, W4 X" |- Q; e5 v) c
然而文件比较多,又想偷懒下,使用下列方法来实现。
M# G' z+ I7 w5 ` p7 x
6 d0 A, Q! F, t. Q将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
, x) u* w! F9 ?0 s% I* Q# W
$ r2 Z' Z& u( H/ v
& l( b" Q2 |% N$ ?- <?php
: q/ O% G% ]6 N7 W2 j y2 I' S - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
7 F7 R( e' k. l( m$ } - $HOME = dirname(__FILE__);8 U. m+ c A- `& Q
- // 如果是Windows系统,修改为:$WIN = 1; `0 _$ H8 j& s
- $WIN = 0;, K) g# u! L; O5 x# l
- ?>
6 v, B7 i! L3 P1 g - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">% }/ o$ Q! R1 s1 z
- <html xmlns="http://www.w3.org/1999/xhtml">" j9 R: A$ B; ]/ j+ D: C
- <head>
) w' M# O5 a, X' {) u - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
. `* |6 E# M- E/ T T9 }' S$ |$ H) T - <title>UTF8 BOM 清除器</title>
E* n I1 k8 @+ h- f9 F5 q+ | G - <style>
/ j) f* L0 |5 _& _! T - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }/ W: ]/ L2 M3 `
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
( \; [: G2 P. H# |; G8 F - </style>
! f4 k! S' D; c K - </head>- M1 C$ Z! Z8 W" ]7 X" D
- <body>
6 ]( V& U9 @7 p9 S - <?php
" d* L: `/ z7 E( L" h j6 Y - $BOMBED = array();
; z. j6 _3 z+ R+ s' ] - RecursiveFolder($HOME);& X" K& W. G, b3 c; A3 V& K
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">'; W6 @: z0 N; q9 F9 k6 {: J5 ?% A! D
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
' }! [( a' H1 [5 E( ~' J - echo '</p>';4 R. c7 n: k. N$ o$ e
- // 递归扫描
: m$ ^# T% y/ y: d - function RecursiveFolder($sHOME) {
! d! E' `9 a7 u8 |7 F$ e2 A - global $BOMBED, $WIN;8 _% s9 w$ y- N
- $win32 = ($WIN == 1) ? "\" : "/";
5 Q5 Z5 I5 A+ K - $folder = dir($sHOME);
4 @8 Q4 h y; U8 o4 e - $foundfolders = array();: Y# p1 B1 C( n# a
- while ($file = $folder->read()) {
% ~2 G7 m# I2 i# V% n - if($file != "." and $file != "..") {
7 I+ K2 J( V# u$ X! u - if(filetype($sHOME . $win32 . $file) == "dir"){
j- p# B( H$ z# `7 m7 l3 E - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
3 L( E+ B/ P/ a4 I& k+ K* S' g - } else {% S* U y& H0 p, c2 b0 f
- $content = file_get_contents($sHOME . $win32 . $file);
2 E" \7 O) C5 W+ I8 J - $BOM = SearchBOM($content);
5 c1 N2 Q8 {# M1 a; W - if ($BOM) {
$ m/ d8 b3 |+ j* j5 } - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
5 g+ R$ R8 y+ `' L% q7 q& }: x* \! \ - // 移出BOM信息
- g$ u( u2 J% m" s) ~ - $content = substr($content,3);. h( s% `, @! J! \ H' n
- // 写回到原始文件
/ {3 I5 N+ ~' ~% P5 R+ A - file_put_contents($sHOME . $win32 . $file, $content);
( H8 D1 a$ F2 _8 Y8 ` - }
. q7 u$ h+ w$ R4 O( X - }+ \: n% @# p1 A
- }
7 r* @, j( C3 S8 G' b4 I I" S( r - }- l, U. X1 J( G `2 G
- $folder->close();: H, D! J7 w* {2 p
- if(count($foundfolders) > 0) {
; t% a* E0 V6 s3 D0 g+ g5 P - foreach ($foundfolders as $folder) {
- C8 H/ r% Y9 K - RecursiveFolder($folder, $win32);
+ x4 H8 G) f \1 w1 j! j+ x1 ? - }
( p0 s5 d4 ^9 k1 R/ q* h6 `6 [0 } - }; g* b2 b y- Z6 J; \& b5 E/ i
- }
1 D7 C& b, p3 K; [7 U4 @ - // 搜索当前文件是否有BOM
' ^+ P- }. o5 G* j" p r9 t6 I, h - function SearchBOM($string) { 8 |2 T$ u% Y) m
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
2 u, _, @) R" m# z2 ~& v( |; P - return false; : i5 _) A- S j) _; s
- }
3 M: t+ i* V3 I1 g2 v# } - ?>2 z& n1 U) k" J( P4 U
- </body>. M% B# r) Y% c. b
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!( S) @$ v$ \ g- W M. T* o- ~2 b
Y" E1 Z" Q7 T, x+ d |