开启左侧

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

  [复制链接]
68010 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  ' U% R$ D& t+ W8 [+ ?
# E" Y  ?: Q7 j
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
5 J3 H; Y1 ]2 {6 t2 t
( a0 ~: A1 L5 @  Y( _6 M它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。/ M% j* D- @$ V' G) t* V+ x6 H

9 r. J( R+ M# s对于一般的文件,这样并不会产生什么麻烦。6 n+ f9 o. ~$ h  X( ]8 ~3 y

: W7 o  ^" ^, d! e2 ^; b6 {但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
% j5 d* d* G3 l  f" }' v5 ~  b
8 m2 z; `" E1 t: ]7 d# f根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。3 m+ a4 |# p  U- D
3 D6 S  d; O; v! _" }1 |2 @
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!  N, Z4 L* }0 _; u+ J# t7 t/ f
. K7 T! i! y6 u2 k% b+ m- z
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   8 V6 U3 b, A2 D5 F# i8 ]+ D7 [

6 X7 z7 f8 o( a6 V0 L/ g1 N然而文件比较多,又想偷懒下,使用下列方法来实现。  
1 d5 Q) N# u$ a1 A
: r( l" e  k: ]  k/ t将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换% w( T. j; j# C, A
% q! ]9 [% v0 H: Z! L9 G: v6 Z) X
5 f% ^! Q% i$ d7 F
  1. <?php
    1 t3 Z2 K! c4 T5 ]0 d: [' o
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    7 j9 G" V% _! J( m, O% _6 `, _
  3. $HOME = dirname(__FILE__);
    $ J0 R6 t# j  A( k! J) Y
  4. // 如果是Windows系统,修改为:$WIN = 1;
    5 B9 b2 Z6 b( S: {% G2 A( {2 `* N
  5. $WIN = 0;
    3 Z) F7 D5 m, r& Q
  6. ?>" E! K7 v0 w5 p
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    " u9 E  X4 Z" Y  p+ G, H7 ~) Q1 u
  8. <html xmlns="http://www.w3.org/1999/xhtml">8 V; ^7 l1 w, q1 W: q( K
  9. <head>
    3 Q3 @# e2 v4 M5 J
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    % v) x+ c: _1 N' c4 b, Y; t9 c
  11. <title>UTF8 BOM 清除器</title>3 G3 Q5 v, n0 `/ N0 w) i
  12. <style>
    + E& d4 R/ D( Y  H1 G- X
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    . S5 K& b; B; `) y+ O+ u. \
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }, B! J# q. J/ m# d6 }% C; P  }
  15. </style>
    9 G1 U5 t1 g& Q) ~) Z$ h
  16. </head>* f# f8 S0 |% K! Q, n
  17. <body>! F% ^5 v, `# X2 R3 W
  18. <?php
    ) F3 [& U% F, |3 Y. T6 O7 d( j
  19. $BOMBED = array();, X: p- z0 J) i8 R( P- F! y3 k- M
  20. RecursiveFolder($HOME);
    " Q( h( k! o% V' E5 j
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    5 i/ O+ H' t7 ~7 g1 H
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    " f2 E3 v5 m. ]5 `( n" |' \8 z
  23. echo '</p>';! k$ \$ t7 A/ S+ a' ?3 M
  24. // 递归扫描
      g* v; W8 a. X/ w4 ~' J' `
  25. function RecursiveFolder($sHOME) {
    * x- l2 |4 W% X2 `" x. _
  26. global $BOMBED, $WIN;
    / p5 n+ z' \' C  a  b2 H  M
  27. $win32 = ($WIN == 1) ? "\" : "/";/ |" ~7 l7 O7 o. K
  28. $folder = dir($sHOME);
    $ _) s6 u, P* X9 @" ]
  29. $foundfolders = array();! `1 j, Q- |. x
  30. while ($file = $folder->read()) {, _0 y0 o4 I) Q! j  s) o' _4 b
  31.   if($file != "." and $file != "..") {' Q$ G$ j& @% C; Z6 B% [; C8 Q3 F
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){" F- }5 G8 G/ j2 K/ l& U3 h# H. W
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ' O$ B0 F: \3 `! f* A( A9 e) K
  34.    } else {. l5 m9 r6 Q( r$ K8 W: Z% F% S& u/ g
  35.     $content = file_get_contents($sHOME . $win32 . $file);5 l" Q6 Y: \4 g  l
  36.     $BOM = SearchBOM($content);2 j& `* `# F- m; U5 m8 ^9 u
  37.     if ($BOM) {
    6 ?5 C9 ?5 A2 x
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    4 d- K) T  Z. ^
  39.      // 移出BOM信息" C8 l2 S3 g8 k$ @, R" Q# }+ |: w+ Q
  40.      $content = substr($content,3);
    % d$ k: g6 P- n  v+ r& \) I
  41.      // 写回到原始文件
    - K$ n2 g( A5 ]) v+ {6 }
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ! Y) g. R8 u# R7 X6 u- r( ^1 N
  43.     }
    ) m+ j- h& H1 l
  44.    }
    ( N$ a8 {, q# W+ @/ ]1 A
  45.   }
    8 b) x& ]0 ]) x: B: B, f* _+ d: g
  46. }
    ( N( p( ~: `9 s' @1 ^6 s# k) A
  47. $folder->close();# O* Z( C2 r( j5 X5 x
  48. if(count($foundfolders) > 0) {
    6 p- C) M) c- \
  49.   foreach ($foundfolders as $folder) {' m! J3 Y! E/ ?7 H# f" L
  50.    RecursiveFolder($folder, $win32);4 x1 J2 n9 Z4 v1 q
  51.   }6 L/ {9 B3 k9 \7 P' x
  52. }5 H  g) x" {6 O) g) M2 D
  53. }
    4 p" b" M1 p( O" `% C& M0 ~
  54. // 搜索当前文件是否有BOM
    & U/ l- i3 a7 _' u
  55. function SearchBOM($string) { 9 e% Q4 z0 F% C% j( M2 \
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;& R( N: C. P5 Z, t! g0 k3 U
  57.   return false; , m5 ^: k9 `6 t+ u
  58. }
    4 h$ |- |. p) V8 x/ k1 N; L
  59. ?>8 k2 u7 }" I3 T, q: O
  60. </body>% V6 b* h0 F; c$ I
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 e1 {( s5 b- O
$ {2 @9 C9 @9 e# |/ Y: }

本帖子中包含更多资源

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

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.