模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。
7 `3 e! A1 E& [' X: @( n
) G, U% Z* h- |0 L W+ y0 z! \这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
! i5 R$ h$ m ~- Z' s, o/ Q
1 P0 n8 Q( l! y/ t4 v3 s4 O1 D8 l它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。( R( i0 e+ [, c# y/ `
% f6 \2 h% |# O7 m
对于一般的文件,这样并不会产生什么麻烦。
3 n- B+ _0 R/ a5 n" e
& `0 Q- h+ m& s9 J; [- x& S但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
+ v, V% z( }! d$ J/ @( Z- b5 d0 X4 p% \, P8 r6 f$ e7 Z% |/ @. K
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
$ Z' J/ ~2 A# l Y8 u. L. |+ v3 `5 X9 _
. E* z& q; p" r6 Q& [% m3 }7 j由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!1 K9 x( p% g; k+ h
+ H F0 ^' r' k' v
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
) |0 w0 ^3 n. Y$ d9 u9 X/ r- z4 [; y# D; N
然而文件比较多,又想偷懒下,使用下列方法来实现。 0 h$ p" I( @- w4 N/ q* W2 Z$ t
- P! t2 K# H' \+ e5 `* a5 T将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换" z$ ^- m0 J+ M7 `3 P5 c0 O$ R
' C! b/ `/ o) B
0 X% @, q. \9 ~! R- <?php
4 ]3 s8 R9 p( c# X' h) h$ m. P; n - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)! R W: q. F. E" J: @, O
- $HOME = dirname(__FILE__);7 G" N2 x V9 x, j( z
- // 如果是Windows系统,修改为:$WIN = 1;
7 g" g( b2 K* y2 O: w - $WIN = 0;9 H, r# A- i7 t, @( j1 c$ p
- ?>: G# A' ?9 [% L, j& J; O
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">5 p; w8 T+ X- O0 r" ]8 x6 r
- <html xmlns="http://www.w3.org/1999/xhtml">0 `0 \+ L1 i7 S. N. P5 p9 o; n' e
- <head>8 E5 E0 c" }# {) p3 ?, O
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ i5 ^* ]: M6 u! Z% Y' r* ~ - <title>UTF8 BOM 清除器</title>
3 e0 ?$ K7 h( G- m# V( D - <style># o6 Z. L7 N9 J3 u, o3 D
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
9 N- U% a- D: ^7 ?* X" ~% y2 S - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }; l( ]3 e0 o1 p6 E' F3 v6 u
- </style>
% Z L1 B# L' @: Q. ~- h- N& H5 C - </head>- i! f# \* @5 R! w6 L
- <body>
' u. c7 C! s; f9 k% z$ i6 n - <?php
3 {+ p) q, N9 A; M5 ^# U& F) G - $BOMBED = array();" R( p1 D9 F; ?
- RecursiveFolder($HOME);2 y: w' A$ C) S$ x0 X
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';7 I2 V& k# N7 f- H2 z' \# g/ H: I
- foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
" v9 p6 s! \* X5 x8 m - echo '</p>';5 |* ^0 e3 G1 }
- // 递归扫描, I3 w8 p& U' y' k- t. y8 f2 D+ a
- function RecursiveFolder($sHOME) {
( d3 W+ o- I! O9 J) U - global $BOMBED, $WIN;
6 s5 J8 G2 }, e( N" f6 E - $win32 = ($WIN == 1) ? "\" : "/";/ `1 t; r+ _ \' J# m
- $folder = dir($sHOME); O0 Z1 C3 V8 p* S% c& p1 u
- $foundfolders = array();
: A0 s3 m' E5 y - while ($file = $folder->read()) {
$ f! J: @7 l0 D! H5 W - if($file != "." and $file != "..") {) }0 G1 x0 U, @& |3 {
- if(filetype($sHOME . $win32 . $file) == "dir"){8 K) I) D) a6 Q- x7 S
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;# o8 _/ ^/ f! N. n+ m+ |
- } else {$ w) N- @* s2 I' E9 a
- $content = file_get_contents($sHOME . $win32 . $file);
" q2 x: v3 M- n6 | - $BOM = SearchBOM($content);3 U* _& U g' F7 r
- if ($BOM) {
3 |. e% |2 P- k - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;! U" b# A/ q% j" A w
- // 移出BOM信息
% V9 Z. r; L" j8 J- f& V - $content = substr($content,3);
. X( s, L* h6 W0 I4 J. h4 g4 N0 f - // 写回到原始文件& f0 X- U5 f" k$ U
- file_put_contents($sHOME . $win32 . $file, $content);6 p' f7 Q. A+ U
- } J; c+ o4 @* |: y# i
- }8 s9 ^7 a' m& @3 s
- }
2 ?$ D+ x3 Z5 L$ @, [5 V - }
: s" ?/ d5 y/ {, O0 `8 e - $folder->close();& c" i5 K+ `8 F3 Q
- if(count($foundfolders) > 0) {* V1 l" A( g8 e; d! _
- foreach ($foundfolders as $folder) {" {" T3 `) x" f! \6 r
- RecursiveFolder($folder, $win32);: k4 ]2 p9 a# G# k& h$ i
- }
: y, E4 r! k0 Z, k" c! L - }1 d! Y: P. U; {1 z% L V4 X, K, w
- }6 |- H' \0 p% k Y) k; Y
- // 搜索当前文件是否有BOM
4 J! a1 o8 L) S0 c- K - function SearchBOM($string) { 7 K( x$ ^' D; I( z* l7 v9 _- ~
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;$ R8 U5 [- x+ @8 Z4 j3 F
- return false; : k4 D' n) p: v- S" t" e
- }- d: M- O# Z: Y
- ?>- S& o3 G+ v4 g% _0 e6 m# n
- </body>$ ^1 @6 O: Z- M+ M/ V" \
- </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!. L3 w- a" s4 [- a* L# C j k" \* B
$ y( p& Z# W1 p2 b
|