开启左侧

非法字符 原因 以及解决办法

  [复制链接]
67928 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  " u3 w' x2 J! X5 R

: i: H/ E, m- j7 Q, b$ F/ a1 q这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
5 ]3 T! _0 D! r& k" \2 G- Q" e- d/ N, Y9 h. E/ Q% M- z+ b
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
3 w/ T/ Z" ^1 N0 b) L7 e& T& @
对于一般的文件,这样并不会产生什么麻烦。
/ y( F/ d) q! n4 ~7 X2 e: S2 p
( T) V) n3 Y% k2 X但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。1 p/ W  e) m3 c4 A+ K! j& f
% @$ E3 w4 G8 U2 @  u( a
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
' X3 d- T9 I8 i: [0 _$ J9 t1 m% e7 A+ h& X$ C) {
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!; x8 S) w6 Z+ E- K* U! x

" F1 I! t1 u# A0 P/ b2 C直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
* U+ _; r0 n' c: K! h0 J" M1 Z% q: m; n5 ^+ \
然而文件比较多,又想偷懒下,使用下列方法来实现。  # F  _- C/ C6 ~  C6 b& x

7 m1 M+ U4 `2 M将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换2 k: H: O) c3 `, z
& w1 i& T6 q9 Y( ^
) u; x8 d8 }- d) F8 }
  1. <?php - J: A$ o4 s0 R& q5 S
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    2 M) C" g+ Y1 n7 t
  3. $HOME = dirname(__FILE__);( D/ o7 Y" M4 t8 H$ r% g. }
  4. // 如果是Windows系统,修改为:$WIN = 1;9 ^9 A. Z' o' c( |/ t
  5. $WIN = 0;
    ( h$ A: A7 K. U7 A
  6. ?>
    6 I' m5 {, ?  l6 {& r) e) H& _: Z
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 J, E& u. h4 ~+ K3 o6 X
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    . j$ i7 I. w7 l) K
  9. <head>2 |. S5 t2 K5 k5 [3 `- g- e% ?
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    9 m8 s0 M3 S7 O7 c* V
  11. <title>UTF8 BOM 清除器</title>. B5 a3 y! G3 l6 n. ^+ g
  12. <style>1 R6 K' n7 S7 o# f( `# E5 y& X! o
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    # T: z+ o+ L4 N  @/ z2 Z
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 Y( G$ m0 x0 Q0 i4 t0 U) d0 E
  15. </style>" Y2 g) k) I4 W  X% U  h0 W
  16. </head>3 C# d" T. Y7 p, Y
  17. <body>
    2 g! H# ]/ p+ X0 q4 A" K, x3 E
  18. <?php0 F* R+ n% y  p+ c' m& e$ z1 b
  19. $BOMBED = array();, E. a; V+ l; L) r( w; f$ r
  20. RecursiveFolder($HOME);/ N3 p, w: U  l& G
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';1 h# ~* I% ~, {4 `! G9 B
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }& w' j" t" c# t" p( h1 h
  23. echo '</p>';
    - G3 b/ P3 [2 {6 R
  24. // 递归扫描
    / Z# y/ p* t7 t) w: p8 `
  25. function RecursiveFolder($sHOME) {  a( }( I" Z+ N" v" _# l' [; _& j
  26. global $BOMBED, $WIN;
    0 [/ Z6 z% S$ r: ^1 r- K  d
  27. $win32 = ($WIN == 1) ? "\" : "/";0 F9 ]: c+ x+ T3 ~  |  Y
  28. $folder = dir($sHOME);  \# I" a! e6 W* d
  29. $foundfolders = array();. P, U' y  L, P
  30. while ($file = $folder->read()) {1 Q7 H6 B* O% E' |. C" r& u
  31.   if($file != "." and $file != "..") {
    . H1 V' A( b( p+ ~/ l0 ?
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    4 l+ b( @6 z& r5 [7 Z7 J4 F
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;) O7 Q' w: C, ~" A* Q2 H# i6 f$ f
  34.    } else {
    . [, E# T. m6 Q; ?( E
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    . F8 |% ^9 m, c7 [/ ]1 X
  36.     $BOM = SearchBOM($content);
    ) R8 t: w5 E$ J! ~' w! \/ q7 x! Y. z# X  e
  37.     if ($BOM) {( M) v1 k8 C4 H8 ~; w
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;; T& \8 _- A$ Y' {, w% n; b  ?
  39.      // 移出BOM信息
    , B9 z! d" P) D
  40.      $content = substr($content,3);" ^3 ~8 C2 T' M4 u* k$ X
  41.      // 写回到原始文件
    3 J$ D- P( f2 x0 P+ p( S  s8 J& Y
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    3 ]+ Q' v5 C0 i* P0 z
  43.     }
    $ \8 B; z: m; q1 m( b. E
  44.    }
    1 v8 c7 M4 R" O% f. d* i, ]. A
  45.   }
    / K4 K7 D& ~% X0 ~
  46. }
    * F* r  X) \7 _! ^" n# y
  47. $folder->close();
    4 _$ g2 \& l( A
  48. if(count($foundfolders) > 0) {8 d" I; N' y7 J7 s9 T+ j0 n, Q; i
  49.   foreach ($foundfolders as $folder) {
    ' x, Z  a  B$ J6 L5 w5 n" n, i) ?+ n
  50.    RecursiveFolder($folder, $win32);, f7 @( B% Z6 E2 C
  51.   }9 b; P! [5 l$ U$ \7 j% B
  52. }
    8 R3 h5 Q* |8 s) f2 V3 `
  53. }
    ; @# p/ u/ C' a6 [$ e" W) v& n
  54. // 搜索当前文件是否有BOM9 R1 S6 n/ g' B8 C* r$ `2 W
  55. function SearchBOM($string) {
    4 z3 h, M  G8 o( |8 B1 \
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 j1 @) M, q& ~
  57.   return false;
    + T4 M$ y7 k) j
  58. }8 u/ n- z3 Y7 z" {7 b+ q5 S; i* w
  59. ?>% k  [* {* A+ m. ^/ t5 c& P& M- F" k
  60. </body>5 T7 r5 y, E' ?$ k& ~9 p1 Y
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!$ D' G: F& q- p5 \
3 F) V* ]. t3 H3 b

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
收藏
收藏0
分享
淘帖0
支持
支持0
反对
反对0
回复

使用道具 举报

精彩评论115

跳转到指定楼层
沙发
9x06k1t2j1 发表于 2017-11-21 21:40:19 | 只看该作者
确实不错,顶先
回复

使用道具 举报

板凳
z54012ce5i 发表于 2017-11-21 23:46:00 | 只看该作者
……
回复

使用道具 举报

地板
0c923d0rh7 发表于 2017-11-22 12:53:01 | 只看该作者
佩服佩服!
回复

使用道具 举报

5#
sl46h92w29 发表于 2017-11-22 19:52:57 | 只看该作者
是爷们的娘们的都帮顶!大力支持
回复

使用道具 举报

6#
zf05f43b2y 发表于 2017-11-23 04:20:01 | 只看该作者
我也来顶一下..
回复

使用道具 举报

7#
1g27uj781t 发表于 2017-11-23 11:37:56 | 只看该作者
沙发???
回复

使用道具 举报

8#
00851v3lgq 发表于 2017-11-24 11:25:22 | 只看该作者
……
回复

使用道具 举报

9#
47l53797e3 发表于 2017-11-24 13:42:15 | 只看该作者
学习下
回复

使用道具 举报

10#
b8i2oq76av 发表于 2017-11-26 04:36:31 | 只看该作者
围观 围观 沙发在哪里!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注

粉丝

帖子

发布主题
推荐阅读 更多
阅读排行 更多
精彩推荐
关闭

欢迎大神访问! 常来~上一条 /1 下一条

扫码联系微信

QQ号1:864750570

QQ号2:736375048

联系其一即可,YES~

QQ群9:752758310

管理QQ:

864750570

(有事咨询、留言,请直奔主题)
广东省深圳市南山区科智路08号
864750570@qq.com

手机版-小黑屋- 程序源码论坛  

Powered by king X 3.4© 2016-2023 www.cx1314.cn Inc.