模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。 + Z* C+ P: g) Y
' D9 G. y9 {; Q- s4 B+ s
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。* a# T6 C( n" L4 P; B' [! P
3 y4 Q1 A1 W1 M: F1 q: y1 m它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。+ K' c k5 w0 `! g
: J! U( G% P! }9 X, T- k
对于一般的文件,这样并不会产生什么麻烦。
; H' X4 b! [7 W# j. w `9 m+ \* x* p' p
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。/ r4 h3 p4 y5 l4 T
2 r( \4 M% }4 N
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。) n. H) s: ^' h, D0 Y
1 ~7 Y7 f; _; @4 Z9 i9 ~
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
" c. O1 r6 L8 k$ X7 l+ i0 \. x' S d/ R2 D1 Z Q
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)
S1 o. ?$ Y8 {5 A! a! S2 X& T! Q% v% A8 R
然而文件比较多,又想偷懒下,使用下列方法来实现。
8 U; n' V9 f/ P. X
! O- z8 S5 g E) z! _9 x将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换) q, [# d/ V! F$ E$ [4 v4 Z
1 L/ E$ U! F1 d: Y- K6 f S4 M6 H5 Y! B6 Z% N# @
- <?php
: f& J+ J7 R }9 |' I, A8 v9 ~% [1 m6 D - // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
1 z0 T4 V+ T3 F( K/ b$ o' G - $HOME = dirname(__FILE__);
; f9 ]) n6 m% ? - // 如果是Windows系统,修改为:$WIN = 1;
' x' ~! @6 N# r' O0 {' r - $WIN = 0;, O. w( E7 G; I$ u2 [
- ?>5 k+ {8 K$ i! o2 ^- d) f% x J
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">- n$ l5 S c# y
- <html xmlns="http://www.w3.org/1999/xhtml">
; z+ M& @ h* ?! P. X - <head>
/ j7 Q) x1 U7 Q! F7 L# [% a - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />/ Q4 s$ s& M7 p" l
- <title>UTF8 BOM 清除器</title>3 Q& z# Z: P9 _6 u
- <style> X. g: J: E: C0 [
- body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
! I5 J3 a! c+ B* d% \ - .FOUND { color: #F30; font-size: 14px; font-weight: bold; }6 q1 Z' F/ q W
- </style>5 _) I0 E; _7 O/ o4 M4 _
- </head>
+ j3 [) a r/ U& N: ]! A6 } - <body>6 j' u" y% I {6 h# l5 K1 {7 U5 m
- <?php
& O1 J( D2 A7 `; H1 f! U6 h) s - $BOMBED = array(); n9 l+ r1 e4 q8 v7 ?# |4 N9 s/ \6 Q
- RecursiveFolder($HOME);
1 o! b, n V8 N5 M% B - echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
) V+ e# f9 |0 j4 V. | - foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }4 w! }) J" j" W
- echo '</p>';
. T7 W6 r: S$ K* r, g, q# b - // 递归扫描. {6 ^( }" u0 N3 a4 H
- function RecursiveFolder($sHOME) {* Q) ~9 s9 ?4 r: M+ V1 [% L
- global $BOMBED, $WIN;8 }3 z3 u. J7 L& A) y% a. a
- $win32 = ($WIN == 1) ? "\" : "/";
3 Y q- p9 O5 X - $folder = dir($sHOME);) Y$ v- \, Y7 ]
- $foundfolders = array();* Q- F, {6 F0 v# K2 a5 x, {4 A, G
- while ($file = $folder->read()) {& s2 g n' E' _8 }
- if($file != "." and $file != "..") {
3 F8 ]- Z3 ?# \. Y - if(filetype($sHOME . $win32 . $file) == "dir"){
J* n$ c; a% t2 @ - $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
5 C* H5 x7 K, k8 c ` - } else {
- ]' d" U b. h6 o& \3 D' e% _3 a - $content = file_get_contents($sHOME . $win32 . $file);
7 s* P5 E1 |$ J' W: d2 ?- w6 O5 d - $BOM = SearchBOM($content);, V$ K8 i r7 T5 ^5 m
- if ($BOM) {2 ^* ]9 J1 n1 v! i2 I8 g2 v, [$ `
- $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
' u2 B) H6 L+ R" E! p$ _( G' @7 i - // 移出BOM信息! N1 Z' A' `2 v5 J) b4 M
- $content = substr($content,3);
# d& W0 t7 J6 D" j9 a7 H7 k - // 写回到原始文件, e/ O+ d* V7 n
- file_put_contents($sHOME . $win32 . $file, $content); V9 T+ ?! W9 }7 [
- }/ x" l& @2 u+ ~) ~ m) g
- }' @- }0 @$ A, M/ e) c/ \6 b
- }
$ Z$ F/ b6 G' [ - }
0 \7 y8 [* E' L( [: Y1 W! Y. T$ i2 A+ T - $folder->close();
; @- K$ N% y; @ - if(count($foundfolders) > 0) {6 n2 ]9 u3 F' p' h2 g
- foreach ($foundfolders as $folder) {* P3 T$ t1 t5 j5 r" O
- RecursiveFolder($folder, $win32);
3 G6 z: U2 I" R; i( b - }/ i2 z$ E s! Y/ `4 \ @
- }
1 @( q h) ~( ]! f( ?( Y/ J - }% }) }. E5 w6 z1 }
- // 搜索当前文件是否有BOM" K. } G5 I+ Z- Y& _& J
- function SearchBOM($string) {
* x) d, N7 w5 l# f4 v8 M2 G - if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 o1 J7 B3 C7 `- S" u
- return false; * z0 u8 U) L$ g9 m. e
- }
! l/ @9 z: Z) [% G }. W# v+ V4 C - ?>
1 o# L2 N3 r @% i) V - </body>
' s2 P4 s' l7 {" w6 H6 T+ K - </html>
复制代码 这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 S4 D! D H( m0 F$ q; V
5 B, I, I4 N" x, {% g |