模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 8 h* `% Q: O3 ^0 X. _( ^8 r& t5 k
$ s" j- R& [; f5 A: B
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: j6 V$ i, Q' [( N, l7 ?9 i0 o
% Z7 N5 R: Z U% L它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
0 L! Q9 T/ q* V+ x7 X2 W8 b
) H5 {6 n/ r7 T+ H" Z对于一般的文件,这样并不会产生什么麻烦。% N# y0 N( t: X+ @6 h
' G/ l4 O# E% i$ v) Y: J8 e1 z
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
O2 q/ ^1 ]; v' v& Z2 |
W: ?5 M9 `8 q* g根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。5 W4 K5 m% |. F9 H+ F. ?
% R8 e V% O2 L由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!* F, N- g4 Z x: V6 z5 h5 v
' B# d5 x! s4 F3 X K4 ^
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式) # \( V: b9 a* D3 V9 d5 e0 L
; h0 v& e; ?* n# ~然而文件比较多,又想偷懒下,使用下列方法来实现。
- b1 J P% J' q* h% K- t
* S* c/ K# {( K+ G3 X2 H将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换: S3 J+ K: g2 C/ J' a
# c' O2 M. w ~( K( Z4 o
5 Q: b3 x) Q( d% @5 e. u+ |0 ^! f- <?php 1 ?3 N6 k# u8 l+ B1 \7 l
- // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)- {4 C+ a U" b& v
- $HOME = dirname(__FILE__);3 |. D: J. E$ Y$ S4 z/ C
- // 如果是Windows系统,修改为:$WIN = 1;( J1 L% n) {5 w0 l
- $WIN = 0;8 W, j' s3 D% J5 d+ e" y
- ?>4 W8 [% F4 Y2 [- {
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">$ c, j! g* m& X: o0 S1 H( Z# r' @
- <html xmlns="http://www.w3.org/1999/xhtml">
6 d5 Q5 J9 j K) J! Q( Z' M - <head>
0 U- E( k4 Y6 s. F9 b - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />7 P9 a% h- u: c! L2 ~2 g
- <title>UTF8 BOM 清除器</title>
, Y# T x; t; u4 {, u- _; A$ d - <style>& [# l4 x0 C* \6 f
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }$ O! F; j3 P0 _: L. U- u! N/ H
- .FOUND { color: #F30; font-size: 14px; font-weight: bold; }2 I' s2 L3 V" O6 q4 c# _9 P
- </style>
' _0 W. h' j2 M7 d - </head>
! L' l) N: G) U3 w: E. \ - <body>% ~) \* A9 R0 U+ `* _
- <?php
% ~2 W6 Z' O+ Y4 S% k3 F% R7 d+ Y. g - $BOMBED = array();0 N) F7 y8 Z" c
- RecursiveFolder($HOME);' W* N" a0 \( w, ]6 W: B
- echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
( c7 a- T" G9 _* s, d - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
* h$ z7 \; ?! Q0 N. z - echo '</p>';- c+ ~" i+ \- V/ I8 w* A, {. u* D
- // 递归扫描* P) n5 t: h7 d X! `- }
- function RecursiveFolder($sHOME) {
/ S% P3 \, {6 I; D" n8 c - global $BOMBED, $WIN;# |0 `" @. Z- \8 w0 x
- $win32 = ($WIN == 1) ? "\" : "/";2 U7 ]1 Q) o6 `
- $folder = dir($sHOME);
5 k, l1 d9 m4 c6 c/ D - $foundfolders = array();
2 J# ~7 T* t8 s K3 n$ M5 o - while ($file = $folder->read()) {
) o4 G8 z' W* o3 T$ S, Z2 l2 r% x - if($file != "." and $file != "..") {6 f* S6 y, H* h' a* @
- if(filetype($sHOME . $win32 . $file) == "dir"){2 E, I2 m: z3 F8 d) p" y" y& \
- $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;/ w |! P: E( K) q }6 ]. _$ _
- } else {
$ `7 F1 j3 r* U# F$ l P% K% W - $content = file_get_contents($sHOME . $win32 . $file);
0 F" A5 n' g; Q - $BOM = SearchBOM($content);
) g* M4 T% L L+ P - if ($BOM) {9 A) d6 e/ t/ M- T, y- w
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
0 @# S; ]1 Z& i& y - // 移出BOM信息
6 U" M- X; V1 v, Z# l$ t/ \ - $content = substr($content,3);
( z3 R# W! {; D) O1 m3 K1 x, f3 A - // 写回到原始文件
% R" l2 e. p& D4 ], ? - file_put_contents($sHOME . $win32 . $file, $content);
m* ~6 M% g1 P( T$ |; W - }* U; M* @" y3 u
- }2 m. }8 z, l3 N3 R
- }. t( r& q; E1 [* E+ ]
- }
1 Q- J" c% r) E: X5 {, ]$ r& a - $folder->close();1 S% B0 f$ q! W' X7 [6 n
- if(count($foundfolders) > 0) {
) N; E* G9 w" S1 ]; n: ]2 g - foreach ($foundfolders as $folder) { X( ?% y* X1 w- {. n2 e
- RecursiveFolder($folder, $win32);- Y j6 S. v6 K7 ~2 h, I+ t$ R$ o# ^
- }
- A# E# V0 D$ [7 @# B - }8 G! H5 D8 B Y3 L
- }& m1 m& g* ]: Z; U3 n) s
- // 搜索当前文件是否有BOM
) C/ c3 H$ q5 j* z! v - function SearchBOM($string) {
, w- }3 u0 ~# v& [6 {$ `$ Q - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
+ r) ?: S" j# j: ^3 Q* s4 A - return false;
1 O+ B# s1 p' k - }
% ~9 e1 t n, W, J( v - ?>0 t; H+ F* w, {. x! C
- </body>
# T8 X4 a8 B: T& E/ T - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!* q0 j/ Q1 Y" h1 h: x+ X
! a# ^! V6 G% D9 c; ]5 q- x, C; ? |