程序源码论坛-1024

标题: 非法字符 原因 以及解决办法 [打印本页]

作者: cx    时间: 2017-11-21 21:37
标题: 非法字符 原因 以及解决办法
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
/ s  O; Q, Z  B3 c7 e1 C2 E7 f( S/ T- g: m$ P9 w% p" X" M$ i0 ~
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
; T; N6 @  t) U5 e
1 q+ U% G1 B1 R, _它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。# l- s! e8 {8 \

4 L* ~" u) L: N1 {; K; L1 I对于一般的文件,这样并不会产生什么麻烦。( Q$ p) |; @) f3 k

/ l4 M0 h: x2 q: C, U. X1 M+ N6 x但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。1 i* r4 b' ~0 J  n6 Q3 F( F

! J4 ^. N* T6 y. }- `4 o根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。5 |2 i6 g* ^7 u& k5 d3 m9 b5 u" I
9 c3 o2 T6 @( R6 ~# H; a8 b' j/ `0 `
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
9 R0 \. S( g- e$ p: n( j# X
& E9 u: B- R! b; K: C直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)     ~8 \" B8 E4 i! o. |4 t

6 I* ^% Q2 x8 y, P2 |6 a; [: q然而文件比较多,又想偷懒下,使用下列方法来实现。  
& ~3 }/ v3 }& ]) T( Z( F
  M5 |# {* T, M将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换2 q+ J- Z7 n* c0 v% I5 @
1 e! i5 s6 h1 |9 q& }$ l
[attach]793[/attach]
7 I- s4 E: K# V6 ?! U
  1. <?php + d7 j' s  K! l, n
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件), w$ Z( j5 T9 w3 m
  3. $HOME = dirname(__FILE__);, I9 h0 H! K; |' p4 ~* @  d
  4. // 如果是Windows系统,修改为:$WIN = 1;& r; U1 M1 T& A& P
  5. $WIN = 0;1 d$ j% }" J. ~3 u  m
  6. ?>
    1 i3 @1 c" q6 O0 [* J
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    ) K5 ~( q$ J' C
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    * }4 d# s( ?% B
  9. <head>- `  I) u+ B& x6 O% S
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    7 D7 p: V& U* U  f4 G* y
  11. <title>UTF8 BOM 清除器</title>" M/ ?+ P' X3 K5 _
  12. <style>
    ' N2 W: k+ G/ N* F% Z7 R
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    3 n  U+ V; u1 H
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }" R( z% g9 O/ b1 h" C
  15. </style>
    * e( P; z3 U! `% g
  16. </head>
    4 Z6 V" d! R! B
  17. <body>7 T; h# y# F/ c1 h8 S* ~- {6 g
  18. <?php! o0 F3 Q+ U1 S5 C8 D! R6 \1 k0 G
  19. $BOMBED = array();# u( F9 w+ A$ w1 D+ G6 ?; B
  20. RecursiveFolder($HOME);6 c! q( f0 k  T( S3 X
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ; B1 ~# h! f$ G1 D! @" R3 m- F
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    , ?" l8 K/ n7 h5 \$ v/ A# R
  23. echo '</p>';3 ~' ?8 ^+ Z! \
  24. // 递归扫描9 q: i( W/ c. v; E+ J
  25. function RecursiveFolder($sHOME) {( N. f7 Q$ `; E" w; W/ d; C
  26. global $BOMBED, $WIN;
    , w+ s% w! o" ?$ f
  27. $win32 = ($WIN == 1) ? "\" : "/";
    5 C, N; J2 c* T
  28. $folder = dir($sHOME);$ S9 o5 {0 R- B+ ?$ B8 z7 |. z0 L6 ?
  29. $foundfolders = array();
    6 `+ W- ]6 {0 ^- [8 E  y4 N1 d
  30. while ($file = $folder->read()) {
    $ s8 a5 R) G" O: I6 K% d
  31.   if($file != "." and $file != "..") {
    " w) x, |; y8 z; \/ Q. V
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){- T& e+ E& M5 E3 k, Q
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;9 a; C& i5 u( w/ O9 z: o
  34.    } else {
    " x/ ^6 x! ?. {4 ]/ H) ]6 K
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ; [# h4 V* i# S  `  c
  36.     $BOM = SearchBOM($content);% j: r8 b1 _# x8 K* `, d; ^. N
  37.     if ($BOM) {
    ; ^0 ?' r2 `8 A7 o+ \+ s
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
      S, n8 ]. @  [/ Y1 z0 y& S8 v- Z! r
  39.      // 移出BOM信息
    # p. N& Z6 B9 h$ @
  40.      $content = substr($content,3);
    ) ?7 x, r! i* N2 A+ W
  41.      // 写回到原始文件( o+ h% A  m/ ?
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    4 C' h' k  h/ ~% U, C3 e
  43.     }
    ) M4 p: l9 d7 ^8 s5 @
  44.    }
      r. \0 p/ J, Q% }7 k) w( e$ ?/ I
  45.   }% A; f3 q4 D" h- T$ }; d# ^5 ?/ n
  46. }
    * k$ m$ D3 z, R
  47. $folder->close();% L$ W( W  P+ j9 ^2 L& H
  48. if(count($foundfolders) > 0) {3 k2 w- X$ W' |( O- h
  49.   foreach ($foundfolders as $folder) {/ I4 \' I1 ^4 f9 r# f6 K# U
  50.    RecursiveFolder($folder, $win32);
    6 X& C$ u3 `% R0 v, N* G
  51.   }$ t) w' h% |' i: H
  52. }# Q) j7 z/ E0 X0 K0 F! D" d
  53. }
    8 N( k6 O* D* X6 L& T# o: J4 w
  54. // 搜索当前文件是否有BOM6 {" O2 b9 ~3 `( S% J( ?' T9 Q
  55. function SearchBOM($string) { ! j1 ?6 c: }9 I% F- w$ s7 f
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    & e$ v1 p6 L: z( Y3 R
  57.   return false;
    # m# _  n% s! W1 E. Q/ J- C
  58. }
    ( {$ q( O, v: `2 d" C
  59. ?>
      z0 D9 [' U( r$ @( ]: n' T
  60. </body>2 {& J, p, E. k# P- L' c2 \: U  h
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!/ g' d/ `, I, I" P# Y2 f
[attach]792[/attach]
, z3 k' G* c6 K1 @
作者: 9x06k1t2j1    时间: 2017-11-21 21:40
确实不错,顶先
作者: z54012ce5i    时间: 2017-11-21 23:46
……
作者: 0c923d0rh7    时间: 2017-11-22 12:53
佩服佩服!
作者: sl46h92w29    时间: 2017-11-22 19:52
是爷们的娘们的都帮顶!大力支持
作者: zf05f43b2y    时间: 2017-11-23 04:20
我也来顶一下..
作者: 1g27uj781t    时间: 2017-11-23 11:37
沙发???
作者: 00851v3lgq    时间: 2017-11-24 11:25
……
作者: 47l53797e3    时间: 2017-11-24 13:42
学习下
作者: b8i2oq76av    时间: 2017-11-26 04:36
围观 围观 沙发在哪里!!!
作者: 6951398s8q    时间: 2017-11-26 07:13
专业抢沙发的!哈哈
作者: 5dlshd1hzc    时间: 2017-11-26 10:33
啊啊啊啊啊啊啊啊啊啊啊
作者: dg62939w1u    时间: 2017-11-26 11:25
楼主呀,,,您太有才了。。。
作者: 33u50l14l6    时间: 2017-11-26 12:27
楼下的接上
作者: x72795v6kh    时间: 2017-11-26 13:19
我也顶起出售广告位
作者: a0rfc0550j    时间: 2017-11-26 13:26
向楼主学习
作者: r254bfcm93    时间: 2017-11-26 14:18
珍爱生命,果断回帖。
作者: 2349w232s0    时间: 2017-11-27 07:23
一直在看
作者: r38ks41v3a    时间: 2017-11-27 16:50

作者: sj1vg68vf0    时间: 2017-11-27 20:02
支持楼主,用户楼主,楼主英明呀!!!
作者: a63inp3u32    时间: 2017-11-27 23:47
占坑编辑ing
作者: 57ans34rl9    时间: 2017-11-28 07:19
好帖必须得顶起
作者: x3yyf3g87y    时间: 2017-11-28 17:12
楼主呀,,,您太有才了。。。
作者: a2ksv2hr04    时间: 2017-11-29 12:50
我了个去,顶了
作者: 053ea7okpx    时间: 2017-11-29 23:04
占坑编辑ing
作者: gd046vs219    时间: 2017-11-30 04:31
OMG!介是啥东东!!!
作者: 4c7o968t2m    时间: 2017-11-30 05:28
确实不错,顶先
作者: 31w1cg12p5    时间: 2017-11-30 06:25
顶起顶起顶起
作者: 93wx38pf08    时间: 2017-11-30 06:32
顶顶更健康
作者: 631587lhnn    时间: 2017-11-30 06:44
鼎力支持!!
作者: z3br67g600    时间: 2017-11-30 13:41
不错 支持下
作者: beg6bj065x    时间: 2017-11-30 14:20
真是被感动的痛哭流涕……无法表达我对119源码的感谢!
作者: 112015ot84    时间: 2017-11-30 20:09
太给力了,永远支持119源码!
作者: e7u0t94a3b    时间: 2017-11-30 21:15
第一次看到这样的源码,不错,顶下!
作者: fw3oagn333    时间: 2017-12-1 11:56
谢谢楼主整理这些源码,有几个很不错的
作者: pgyo6l277g    时间: 2017-12-1 12:35
啊啊啊啊啊啊啊啊啊啊啊
作者: aod18cq0uh    时间: 2017-12-1 12:46
感恩无私的分享与奉献,119源码是我心中的神!
作者: qa5ii6n54f    时间: 2017-12-2 10:47
我只是路过打酱油的。
作者: n252a9t822    时间: 2017-12-2 12:31
这源码太好了,终于找到你了!
作者: v597y7hs46    时间: 2017-12-2 12:35
1111111111111111
作者: mitlm6e0wn    时间: 2017-12-3 09:38
这个源码不错,顶下!
作者: 511qqd76u2    时间: 2017-12-3 15:26
谢谢楼主整理这些源码,有几个很不错的
作者: 7gvxzb3696    时间: 2017-12-3 16:59
不说了,秒了!
作者: 90msgrml0w    时间: 2017-12-4 21:55
第一次看到这样的源码,不错,顶下!
作者: h39955wj7i    时间: 2017-12-5 13:26
自从冲了永久会员源码,全站源码下的太爽了!
作者: 22r9jdwn66    时间: 2017-12-5 14:20
谢谢楼主整理这些源码,有几个很不错的
作者: 264196t979    时间: 2017-12-5 15:52
第一次看到这样的源码,不错,顶下!
作者: 01xlj6jg06    时间: 2017-12-5 16:55
源码不错,谢谢!
作者: wxou49yj1q    时间: 2017-12-6 04:13
自从冲了永久会员源码,全站源码下的太爽了!
作者: 7h1n6mk259    时间: 2017-12-6 04:34
1111111111111111
作者: q7odmv09ck    时间: 2017-12-6 11:50
666666666666666666
作者: 7b1t1ekww0    时间: 2017-12-6 16:15
666666666666666666
作者: md9h5jpy8j    时间: 2017-12-7 12:55
666666666666666666
作者: 9e0gk5x142    时间: 2017-12-7 13:03
1111111111111111
作者: 8t26udl8bc    时间: 2017-12-7 14:38
希望119源码论坛越做越好!
作者: 5tpo86814a    时间: 2017-12-7 23:53
这源码太好了,终于找到你了!
作者: 9656zdnz18    时间: 2017-12-8 15:25
666666666666666666
作者: 103w2cist2    时间: 2017-12-8 15:25
希望119源码论坛越做越好!
作者: 0m9z15w1t2    时间: 2017-12-8 15:26
优质源码还是119的最好!
作者: lus4hh46c2    时间: 2017-12-8 18:26
楼主加油,我们都看好你哦。119源码是我的最爱!
作者: r35g3c5q8h    时间: 2017-12-8 20:28
啊啊啊啊啊啊啊啊啊啊啊
作者: 8s0tl89k1n    时间: 2017-12-8 20:44
我只是路过打酱油的。
作者: u8rf44rk6o    时间: 2017-12-8 22:27
优质源码还是119的最好!
作者: 095m6xlc56    时间: 2017-12-9 07:42
这个源码不错,顶下!
作者: jenc32i3kd    时间: 2017-12-9 13:14
希望119源码论坛越做越好!
作者: epn8b80jyu    时间: 2017-12-9 15:31
自从冲了永久会员源码,全站源码下的太爽了!
作者: 0zm4k9x87b    时间: 2017-12-9 20:34
激动人心,无法言表!再次感谢119源码帮我找到此极品!
作者: r5vo84403r    时间: 2017-12-10 11:04
看到这帖子真是高兴!119源码真是极品!
作者: u36n73kbqp    时间: 2017-12-10 17:33
很漂亮的源码,谢谢
作者: j3kvg5761i    时间: 2017-12-10 23:45
太漂亮的源码了,非常感谢119源码论坛!
作者: cd365t38va    时间: 2017-12-11 04:10
太漂亮的源码了,非常感谢119源码论坛!
作者: 1isfqla32q    时间: 2017-12-11 05:36
第一次看到这样的源码,不错,顶下!
作者: 5w292r1j2m    时间: 2017-12-11 16:03
谢谢楼主整理这些源码,有几个很不错的
作者: ykiytyl468    时间: 2017-12-11 22:02
感恩无私的分享与奉献,119源码是我心中的神!
作者: 7pxxc7ylhh    时间: 2017-12-12 15:25
我只是路过打酱油的。
作者: 538c6h2c69    时间: 2017-12-12 15:26
太生气了,无法HOLD啦 >_<......
作者: 9s48bpl1lb    时间: 2017-12-12 16:00
很漂亮的源码,谢谢
作者: wk7r8xgc6j    时间: 2017-12-12 18:31
啊啊啊啊啊啊啊啊啊啊啊
作者: 2292aqcn15    时间: 2017-12-12 18:48
激动人心,无法言表!再次感谢119源码帮我找到此极品!
作者: 994ku7p24r    时间: 2017-12-12 21:39
希望119源码论坛越做越好!
作者: 3qf69980ac    时间: 2017-12-12 23:29
淡定,淡定,淡定……
作者: qd8cvg1233    时间: 2017-12-13 07:46
淡定,淡定,淡定……
作者: h62cnz17g3    时间: 2017-12-13 08:54
为了三千积分!
作者: 593hqx58i8    时间: 2017-12-13 08:55
很漂亮的源码,谢谢
作者: tq6a2r9659    时间: 2017-12-13 09:02
源码不错,谢谢!
作者: l98srm544p    时间: 2017-12-13 09:03
太漂亮的源码了,非常感谢119源码论坛!
作者: 836wfpszoy    时间: 2017-12-13 09:05
啊啊啊啊啊啊啊啊啊啊啊
作者: z2thm7i539    时间: 2017-12-13 09:23
强烈支持楼主,感谢119源码!
作者: o2i36r5o1y    时间: 2017-12-13 09:31
这源码太好了,终于找到你了!
作者: ix8yyq38c8    时间: 2017-12-13 09:33
感恩无私的分享与奉献,119源码是我心中的神!
作者: zi4ro28acz    时间: 2017-12-13 09:44
优质源码还是119的最好!
作者: szwvg0t6qt    时间: 2017-12-13 09:47
真是被感动的痛哭流涕……无法表达我对119源码的感谢!
作者: 77047nox15    时间: 2017-12-13 10:17
太生气了,无法HOLD啦 >_<......
作者: rh0b5pfa34    时间: 2017-12-14 15:49
太漂亮的源码了,非常感谢119源码论坛!
作者: 50hovj067u    时间: 2017-12-15 08:19
我只是路过打酱油的。
作者: 0x4v3kbl8y    时间: 2017-12-15 15:27
太漂亮的源码了,非常感谢119源码论坛!
作者: 4snv84970z    时间: 2017-12-16 05:44
很漂亮的源码,谢谢
作者: zc7f3y7387    时间: 2017-12-16 16:24
不错 收下了
作者: f51szu8j8f    时间: 2017-12-16 22:46
啊啊啊啊啊啊啊啊啊啊啊
作者: 152501da2x    时间: 2017-12-17 07:11
谢谢楼主整理这些源码,有几个很不错的




欢迎光临 程序源码论坛-1024 (http://www.cx1314.cn/) Powered by Discuz! X3.3