程序源码论坛-1024

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

作者: cx    时间: 2017-11-21 21:37
标题: 非法字符 原因 以及解决办法
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
( T1 }; L2 y3 k. f8 R2 J& r$ T. i9 z/ _2 j6 n3 Q: p
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
  ?& a1 ?7 ]$ E8 Y
1 H- \) z8 E, {: A, A* H4 M) X7 M. ?它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。9 v. \1 h5 O/ Y1 ]0 E( |, L
4 ~! m$ s& V3 |5 S4 a
对于一般的文件,这样并不会产生什么麻烦。
( \; m" Z; X+ M/ V3 D) P0 G; V8 j! B% W
! m% q$ ]$ S+ s( v7 @但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。- h4 U! U) G* b  B. q1 u/ Y
9 N* w* U2 S( J& j
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。9 {, X; K. D1 t
6 ~, _0 u; q! m; j1 o9 t/ {6 l  L+ f
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!6 h; Z- ]9 Y0 e* q1 `

+ Z3 t/ V# k( N$ \3 A直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
0 b* J0 _( [8 x; c8 o5 G2 b% l: U% _/ g
然而文件比较多,又想偷懒下,使用下列方法来实现。  ; V+ ~! Z3 a# S& D) a0 \* A0 f
" G3 ]2 X" v! _/ |/ \
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换6 ?8 t- p8 @0 {8 C$ i. w
; ?8 B7 }" k& a9 G! r  I
[attach]793[/attach]
: Y& w# ~  O: V- F8 v
  1. <?php % x+ F; \& Y; m* v6 }  t
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    3 o. K4 o! @/ T: m
  3. $HOME = dirname(__FILE__);
    ) E! o# P: T9 r/ g
  4. // 如果是Windows系统,修改为:$WIN = 1;0 A/ ?$ _- ]6 U4 U" h
  5. $WIN = 0;# `9 c( W+ o, o, L
  6. ?>
    3 p% P7 _+ q2 F8 F
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    # e/ v6 J- s( z5 _1 r4 I
  8. <html xmlns="http://www.w3.org/1999/xhtml">" P2 \$ _, p$ b: S
  9. <head>
    & i& {3 q. u) t8 k# e/ m+ A  S% l
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />7 L* a$ s  y9 k: M) p
  11. <title>UTF8 BOM 清除器</title>! s7 r3 ]* {) t9 h% p
  12. <style>: V$ B1 x3 L" N/ J7 f
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    3 w; h- ~+ Q2 Q6 c1 \* |4 {
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }! C* H0 H) b8 u' y( |% F
  15. </style>
    ! o% n# k4 T6 v. `# ?
  16. </head>
    , a) u7 n9 Y- [" a8 ?9 j0 ?  z& |
  17. <body>
    9 `* v4 U; f3 z6 N
  18. <?php# M$ R! L  `8 q5 i
  19. $BOMBED = array();
    8 _  J: Y" \+ W# _; S/ i' S- H
  20. RecursiveFolder($HOME);
    / L# X7 o( X  s% P" W- C: L2 c
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    * K9 g" U4 i& s9 F* t
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }' ~# `3 g5 \! o, V, t+ e
  23. echo '</p>';5 z/ j9 }  Q& n9 V3 ?
  24. // 递归扫描3 ?8 X' ]' W2 m5 d$ O8 J! B3 S
  25. function RecursiveFolder($sHOME) {
    : k0 S* D5 x, ]; Q
  26. global $BOMBED, $WIN;
    * W  R& F! p3 t2 c
  27. $win32 = ($WIN == 1) ? "\" : "/";
    . `3 n2 x/ q7 w: l
  28. $folder = dir($sHOME);
    + f7 o- Y0 S, }' G% _
  29. $foundfolders = array();$ [6 |- o! y! H
  30. while ($file = $folder->read()) {; X3 t1 W4 s2 d( h; `" @$ O
  31.   if($file != "." and $file != "..") {
    / l0 C; l7 p2 t, T) S( u
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    8 {, _3 R# V" A5 E5 D7 O9 U6 h- N2 x, x
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    4 `8 h' j/ T/ Y9 X- S3 `' z
  34.    } else {
    + C6 U0 Q" B' _. h
  35.     $content = file_get_contents($sHOME . $win32 . $file);/ L" A3 Y4 _: ?/ `2 n
  36.     $BOM = SearchBOM($content);
    ( J0 }, b1 w' t9 m% {
  37.     if ($BOM) {
    9 m3 |/ \$ X4 K! N' l% x
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;9 W* l8 s) R) I. y
  39.      // 移出BOM信息8 K2 Z9 T( m7 u6 E% I7 ~+ z. v
  40.      $content = substr($content,3);
    ! l  }8 O4 }- f, e
  41.      // 写回到原始文件
    3 S# B, w$ p  g* E4 p; i
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    / s1 O1 o" T+ g/ a* K2 J5 v) L
  43.     }
    $ o' N: u' a) R9 `+ T" Z9 B
  44.    }$ Q  }4 C! m6 p8 D( L5 n. \
  45.   }
    8 {6 ]0 P+ P: T8 x3 b) {9 [
  46. }9 [( Y  ]4 d  }7 o6 n  _
  47. $folder->close();
      I4 \% l: Q/ }7 \( i* `9 I: ^
  48. if(count($foundfolders) > 0) {% W4 c$ O5 E1 k( Z9 F) t  e
  49.   foreach ($foundfolders as $folder) {, Z( ^6 H9 c1 ~: M/ C6 N+ ?
  50.    RecursiveFolder($folder, $win32);
    4 h# o! f1 R- j+ t
  51.   }" {; K' C9 f4 m' c# W) b
  52. }: C! f/ _  d; ]0 L
  53. }
    7 c. s; ~# |" E1 S6 n
  54. // 搜索当前文件是否有BOM
    $ r  f: \; h9 `# g) O
  55. function SearchBOM($string) {
    " H- G$ {8 K& b5 r4 B  S$ k2 i
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    2 h- K  X0 c) I1 B* e2 ^( N
  57.   return false;
    . M5 n. x3 R+ O; ]
  58. }( D7 l& t+ `5 O$ l. }0 J
  59. ?>+ m1 L1 h1 D5 W0 q2 W! T( @
  60. </body>
    , s1 G) @# q, Z; L: C: u! e( @. }
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!4 w6 {' n3 W9 `3 Y
[attach]792[/attach]1 H( s6 h" J2 ]! [. _. i

作者: 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