开启左侧

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

  [复制链接]
67656 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  " ]8 G- A1 F* k5 [4 k" ]1 T% @

8 v5 Y3 I+ Y; b7 }这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
( V8 u9 I! }" ~, d2 h( G$ m) W) O
) I8 J2 a% l* ~8 d它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
: U) {7 A  p7 R3 m9 V
; E8 O- A+ V8 s7 P$ M2 |对于一般的文件,这样并不会产生什么麻烦。2 Z6 o* F9 r* N7 s

0 H/ _8 t9 \* M" {: `3 }) w但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。0 e3 P& F( h* E( r
( }5 C; ]7 i$ K- I9 y
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。  L, L6 a2 _# V0 z9 t7 q9 g; K. b5 e
9 k0 `0 V& P4 J4 ~
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!. v% n4 h7 q/ Y& k' D

% e- ?! O' [. S) O/ w* W1 l直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   7 h' n& ]1 W, \  [6 d7 y6 q

! O0 Y* ?) y4 e: L* X" t然而文件比较多,又想偷懒下,使用下列方法来实现。  0 h# R1 [) i0 J
/ G: a. O% L% j( R
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
7 K) L& _5 W) K9 x8 O; s- R& s* g/ v6 @  U% ?  W
* ~: Z$ D* ]# G/ M# T' R1 v6 l
  1. <?php
    & \! E: [  T" w( D' Y' x
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)$ ?$ A- M7 b4 l2 r# x
  3. $HOME = dirname(__FILE__);
    5 U' e/ Z. E" i$ z) C" E1 G
  4. // 如果是Windows系统,修改为:$WIN = 1;* I3 z+ \( @# W
  5. $WIN = 0;
    , w. p. }! H! s' N" G
  6. ?>) z$ Q8 D: G2 H0 P8 c
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) |' J8 U2 E! D2 D9 `0 T
  8. <html xmlns="http://www.w3.org/1999/xhtml">+ q6 X8 _$ L( _/ n
  9. <head>
    ! x: N( i# c; |, w/ J
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />% f) U& N: S- x2 G: \3 `
  11. <title>UTF8 BOM 清除器</title>5 j8 f. Q, X  n% @1 {
  12. <style>1 t( G5 c% {8 q- k) {
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    6 F  m7 {0 |; a, T7 N+ L
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    . [" y( g6 d2 H, G+ v. c: D6 L
  15. </style>
    . l! q2 J$ c) s3 y6 X) C9 f
  16. </head>
    + D" o4 [' H2 a7 |3 O, C
  17. <body>% K1 Z3 p4 K9 G, |7 Z
  18. <?php
    ) D$ m0 G2 J2 T6 D# T4 N
  19. $BOMBED = array();
    + Z& Z+ ^  a, }2 @! @
  20. RecursiveFolder($HOME);4 s5 r  j- L9 v( h1 R" {8 P+ Y; y
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';+ {5 D  U* G( G" t- U* B
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }. G; R* Q. k- o; u
  23. echo '</p>';3 d1 P- c+ B& N' t1 G
  24. // 递归扫描6 ]) O7 `2 y) `0 ?
  25. function RecursiveFolder($sHOME) {
    % o  v! Z5 \  v. ^- p
  26. global $BOMBED, $WIN;
    8 M1 ?4 f- T- t5 G4 _- M* g
  27. $win32 = ($WIN == 1) ? "\" : "/";
    / G+ W+ ~9 `# t! b. l
  28. $folder = dir($sHOME);
    0 b6 h0 D( v! S8 ]2 f3 B
  29. $foundfolders = array();6 G  h3 {3 j+ n7 ?+ Z
  30. while ($file = $folder->read()) {# l$ P; i2 j. X, |# B, t& i) S6 f
  31.   if($file != "." and $file != "..") {
    / I" c3 x# A0 t. `
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){5 F) N/ _$ w0 V( ]. x$ i1 r: L
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;8 c- }5 ~2 y' g- ^+ O
  34.    } else {+ L( w4 ?$ f6 W# }4 {
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ! x4 X1 H/ |3 w; k' j( ^4 J
  36.     $BOM = SearchBOM($content);4 Q0 X0 C5 q3 d8 P0 l' Y, L
  37.     if ($BOM) {
    / l  u/ v: z/ Y% ^2 D! G
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;( F% y6 F3 Q& y& n, G
  39.      // 移出BOM信息
    ) S7 h! q4 H% e. s5 X: ?4 Z3 J
  40.      $content = substr($content,3);& q" b$ l$ ~! @0 N% V% t: r
  41.      // 写回到原始文件6 T$ \& G3 B( y# }2 b1 H
  42.      file_put_contents($sHOME . $win32 . $file, $content);8 P* r* h7 k. _+ w9 N1 V* n
  43.     }2 w+ l. P0 l( Y: c9 z" [3 Y, F
  44.    }+ o& r: V$ t% d7 X0 ]
  45.   }% x" V2 Z9 l8 _) Q1 `8 O' w4 }
  46. }$ |( L/ q, ?" h
  47. $folder->close();8 l. n5 t9 z& t2 \
  48. if(count($foundfolders) > 0) {
    # K% a0 I' O& Q) H( ^3 X
  49.   foreach ($foundfolders as $folder) {
    ; b2 P: d6 R3 Z9 y% G+ @
  50.    RecursiveFolder($folder, $win32);
    ) v; h5 x/ s0 |8 h; v
  51.   }- t  C* f+ r! ?% p( d2 D7 F1 I
  52. }8 Z- C9 B& X$ X, o- }
  53. }" h, O& l% U6 y
  54. // 搜索当前文件是否有BOM
    3 G: g& \( W, w# ^9 d; I
  55. function SearchBOM($string) { ; K/ V8 W* s( i( h4 y
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    , s; O) k$ H2 v1 b) e. b
  57.   return false;
    " b5 C$ {! K/ F' {3 b' s: o! r
  58. }
    . f# B; ?: Q3 F( @/ F
  59. ?>7 t' M$ M; W+ q2 T: h
  60. </body>- f9 n6 M7 f" f8 X4 F
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
8 ]% g# ^& e- D8 G" ^- N: _: ?
: L6 B2 E5 B$ ]5 O( c! K; s: U

本帖子中包含更多资源

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

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.