开启左侧

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

  [复制链接]
67674 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
1 u( j( t: G* x
) b; t- b) V' M: e这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
; E3 N/ h8 h6 I5 y* b1 N" ~, h) i0 ^
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。" Q) k! C( d5 T6 ^# Y
6 m! [' ?, C6 x
对于一般的文件,这样并不会产生什么麻烦。, T8 l: O( T2 c. D/ G1 ~6 e
/ O6 R  @+ u" G  T$ q. n, `6 l
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
& N/ _( [& y3 g, g, {1 a# l5 W) U; ]6 \" t7 A# C
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。- I1 p) U4 P- n+ V! L$ B( ?0 w: p

  I( x: r5 J9 `. \由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
, B  ]1 t3 }9 \# r- P8 [" L! v5 d9 y. Y
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   9 \/ S! u- _3 w4 I+ Q+ m9 I. Q

" S4 u0 a: v$ x; K然而文件比较多,又想偷懒下,使用下列方法来实现。  : W8 {' j. J+ E+ O

" K  o$ Q& R1 W将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
1 L( O% Y. q5 R! g2 q2 F3 O1 H( h0 i+ k9 m$ I- @

* R$ {" H# ^0 ?$ C8 X. J
  1. <?php
    7 h# S, w2 E; G7 I7 V3 {+ \1 Q( w
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件); [( j& l6 T7 R  U$ h/ F- B
  3. $HOME = dirname(__FILE__);" J# C; U2 N; A6 Y* s
  4. // 如果是Windows系统,修改为:$WIN = 1;+ n4 O) M; E$ t0 |
  5. $WIN = 0;; m, e$ q" }) }2 o/ s
  6. ?>. |4 e1 m* X7 S- X! w# \2 m
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    3 D7 k0 j3 _8 @7 H- A
  8. <html xmlns="http://www.w3.org/1999/xhtml">1 W. R; c3 O9 Q9 D0 Z; \
  9. <head>, t3 {! ?2 h! }
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, k( E9 M  @# ]! @
  11. <title>UTF8 BOM 清除器</title>
    2 Q1 G  s( B9 U( A9 J. y) {9 L
  12. <style>
    4 W6 z8 k+ L! {+ t4 J/ L
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }- N; J+ o  q8 V9 Q# s* `
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    6 O1 t, ^, R' t1 {+ @9 Y* `" i
  15. </style>
    , V1 r, X3 \' e/ K8 q
  16. </head>
    * N; |* a! R4 {3 z* w* V
  17. <body>
    ( y9 _+ |, S& d
  18. <?php8 ~4 k- v; l& C& d
  19. $BOMBED = array();5 E3 B) e1 u5 _: B; j8 d9 V) c" X
  20. RecursiveFolder($HOME);
    $ e$ d- K* [7 X; k: z
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
      e) w- b7 E" c2 s* a* D
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }  _  f# Y/ t$ n$ m3 w% _0 f
  23. echo '</p>';
    ; B4 z  \: e5 }  {
  24. // 递归扫描1 l! ?# ]; M& g' V
  25. function RecursiveFolder($sHOME) {# |& M  S$ k" e
  26. global $BOMBED, $WIN;" N* [- A8 b! n. B
  27. $win32 = ($WIN == 1) ? "\" : "/";) ^5 N- O* e! c# {' T  J: a
  28. $folder = dir($sHOME);! a1 @  k# @  y" i  Y
  29. $foundfolders = array();
    , Y* j3 r$ ?9 b& S* H) y
  30. while ($file = $folder->read()) {
    2 \1 m% X$ z) V" T) y4 [
  31.   if($file != "." and $file != "..") {* `9 x. ~+ |; w
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){! h4 M4 Y, k' T% X3 k& H
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    3 `' J: ^" W5 k) z) `' i5 Z/ Y
  34.    } else {
      h( q6 ?" z* y% S: g3 n7 [
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    6 Y9 t8 n6 [2 h' A$ K- q& A
  36.     $BOM = SearchBOM($content);: s* y- p0 Q+ a  A" F' Y1 ~; w
  37.     if ($BOM) {
    + j; A( r& D6 h4 I& E
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;0 N  Q  N1 Y: ?4 k
  39.      // 移出BOM信息) L* [! T# i1 H8 n2 q: J
  40.      $content = substr($content,3);: w5 T! U) d0 f5 t" m, Y2 u
  41.      // 写回到原始文件
    $ ^* ?. s) Y4 Y7 E& ?4 B+ s
  42.      file_put_contents($sHOME . $win32 . $file, $content);# P- v8 d+ A- Z2 q% Y, ^
  43.     }0 P9 _0 v9 H6 a4 f# ~4 X1 T
  44.    }7 M1 v/ v  u: d' H' s
  45.   }
    : p! J5 ^' M7 ?3 T! `( ^% u; w
  46. }
    : g6 I( W: g0 Y0 q
  47. $folder->close();
    $ u7 q0 u0 ^7 H
  48. if(count($foundfolders) > 0) {9 F+ l! }& I* c% \; ?6 L& o
  49.   foreach ($foundfolders as $folder) {
      B9 W3 [  o3 w, `1 u7 E. n
  50.    RecursiveFolder($folder, $win32);
    8 n8 X$ R4 V# w
  51.   }) j, D. A7 ^; k1 h# k
  52. }
    $ D- U8 Q5 F, K* F1 p) ]7 @
  53. }
    + p+ w/ U- [, H
  54. // 搜索当前文件是否有BOM: j/ v5 L' Y7 O2 h( \; y
  55. function SearchBOM($string) { 8 [/ i, ^: a: I2 t) a# u4 g" h
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;7 b" W5 R6 V9 }% h# ]" a3 L' H
  57.   return false; ( a" _) ]7 U4 [2 ^9 j
  58. }$ n& {5 H1 r4 x2 B7 l
  59. ?>( S; a5 _# B" F! \$ H! V. L
  60. </body>
    ; i  y) K: g1 z, _3 J) b1 b
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
+ ^! {! t) i" Y; X6 @  C' I, `
$ w: f" L: R7 k8 n) @% 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.