模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 h! |4 Q4 Q/ U% Q5 E* K
9 W8 n# N7 u% C" T
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
/ P _2 y/ V @
' V7 n$ X7 d. E4 K8 f' @它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
/ t* U9 g! ?6 A
3 \9 M3 w" N$ q( x7 E对于一般的文件,这样并不会产生什么麻烦。 g1 ?3 ^+ ?' B) S2 C
* S: U5 P$ V! q) n) \
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
- n8 s* E. O8 j9 a: O: p5 _, f) w4 q$ @7 D0 _4 Y% d# ^
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。' L# k: J6 E: f/ k- T2 ?- a/ X) m
1 T s9 h8 f8 ^. T% N1 J9 A! J
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
- V% C% T z& I0 o, c- b0 Y; o
9 g" h, ^! ?: @1 o直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) t! c: k, t' _: k$ f: M
+ k9 d" c0 ?* _& s2 h( j
然而文件比较多,又想偷懒下,使用下列方法来实现。
, |5 [; Q3 i( U" M$ F# y+ n; a1 }% Z& J/ ~2 G& J
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# g# q% n% ?* W& w5 {; n3 x' |9 I _2 b6 [9 |$ t
8 |9 o$ d- E0 ]& \* s& P
- <?php
1 G* T# B# u; _4 i* I - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
/ A$ E1 e6 L9 L! v - $HOME = dirname(__FILE__);* y$ Q- |* \9 D: S, ? s
- // 如果是Windows系统,修改为:$WIN = 1;
7 S" ]4 M' J" ^8 X- @- k - $WIN = 0;
) J* ]0 q, D+ y7 Q3 l - ?>: i% R4 l( u) R, G$ o) V: _
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">1 r6 F3 M$ z/ f4 L. j
- <html xmlns="http://www.w3.org/1999/xhtml">1 R/ \- [. |: b' [3 D, ]
- <head>" P5 C s" U. h. |5 Y, }
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />0 z) K% F+ Q, U8 n6 N m+ F
- <title>UTF8 BOM 清除器</title>3 l% r# l$ c6 a% ]! S8 I- X$ ]+ q2 M
- <style>
( X+ S1 @9 s0 ~& T$ ~ - body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
4 G9 s$ j. F u( a# I - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }" R- B; C8 B5 b
- </style>
. q$ q/ @6 d" ^) y: z+ l/ G - </head>1 J" M7 `% l# K, R- f( E9 s
- <body>$ D' a1 M8 z s
- <?php
* {* Q. ~7 R) x) m - $BOMBED = array();4 u6 w% ]3 |. p! l h' O6 y% ^
- RecursiveFolder($HOME);
1 A) M H" I" I7 ^$ v - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
+ Y. u$ @( U# f }/ A$ g - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }- H7 ]2 N5 S( I; p. V/ z! P
- echo '</p>';) b' \( u9 Z$ o/ A3 Z1 A, F5 m
- // 递归扫描- ` P% B! o4 O8 r
- function RecursiveFolder($sHOME) {
4 G/ D+ e, O; t# a. ~ - global $BOMBED, $WIN;
4 n" y+ @. W9 H - $win32 = ($WIN == 1) ? "\" : "/";. T- R) q# r3 T
- $folder = dir($sHOME);* Y+ b+ P7 Q7 o# o. M) V! I
- $foundfolders = array();
$ A6 Z; i6 {+ w5 s - while ($file = $folder->read()) { G- b+ o4 u2 Y1 F; `
- if($file != "." and $file != "..") {- c' ?8 A% o" v8 Q( Q
- if(filetype($sHOME . $win32 . $file) == "dir"){% Q6 H- S! k; |- o
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
) E; N. ?4 [# x4 R( R+ y3 O( M - } else {
( a: O% |$ T& j" M# x - $content = file_get_contents($sHOME . $win32 . $file);2 W! h `% @. H7 d& M
- $BOM = SearchBOM($content);- ^5 v; J; B5 W, ?+ M* Y7 J
- if ($BOM) {
9 d, g, W, V& Y0 _6 x - $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
( c# Z7 {; X4 k. i+ B/ f7 }# k: q - // 移出BOM信息
( Z; C) ?1 t( M3 ~5 D - $content = substr($content,3);
$ o7 ^: C5 q8 R. P2 V" n3 z5 b - // 写回到原始文件
# k. h1 x6 O1 O- I# m - file_put_contents($sHOME . $win32 . $file, $content);
. C J! {3 a0 L$ J% d0 S7 r - }
) g$ z ?* R3 n% A" ?4 R m - }
2 W, |3 l/ d) b! e5 K3 s8 h - }. W# X0 w& H- F2 X0 ]
- }' ]/ W6 a! y& F& c$ U0 i
- $folder->close();1 T: x# q# M' j; X4 T
- if(count($foundfolders) > 0) {
; h7 h/ R g! n3 W+ d4 z - foreach ($foundfolders as $folder) {* @. f/ E# \% z0 I% L' @
- RecursiveFolder($folder, $win32);' A. K {; m9 @
- }
: r2 V# ^8 q% @2 Y/ x; \0 L - }; Y( h) E; I1 T4 X+ _: [% D/ Z8 O8 S
- }
4 B: G7 d! O9 Z$ e - // 搜索当前文件是否有BOM$ s+ h/ {7 [5 @; d F
- function SearchBOM($string) { . p0 ~5 u( t# _, n) d& b, Y4 a. \
- if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
+ W" c& e6 l' T* X' L2 i* t& W/ ` - return false; 0 F0 m' [1 }/ E6 P6 [2 _
- }3 A* h4 H1 T4 t' E. i" j1 C7 Q
- ?>
0 D, n5 Q/ J$ t - </body>
* n' w$ Q& ?- w+ O$ n0 k - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
% P" x/ E3 o% }: m( k# Z5 n) R) k; Q- b6 f8 J
|