开启左侧

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

  [复制链接]
67789 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
, b& x7 W3 }2 S
! L* L& o4 j- m1 J% S! t9 E$ }这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。( b0 i+ E+ g/ T2 q2 y: v
" c. x/ l. H% d  c
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
/ j& O6 }5 e- W& d6 x
) L8 o% w  ^3 w' c2 U7 L9 D对于一般的文件,这样并不会产生什么麻烦。
! {) p& \1 J# h
$ D3 n2 I2 e( c# [9 X" e但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。: i7 B! o5 T' q" n, x
: X2 M8 l' ~% y* X
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
# M' ~6 x- J% W3 ^- S1 N' \
9 h9 l$ N4 S& ]) v3 O( I" @由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!7 s: l' L- d2 Q" x$ ]
+ P( S, x0 O. k) q
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
) K0 }7 A0 I5 n0 u
& Z! d& Q& H0 W, I然而文件比较多,又想偷懒下,使用下列方法来实现。  5 g: s! w  b1 T; z! A# `; A
/ j6 b, `9 \4 C# W
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换2 @! y8 e, L. a1 I% M
* h5 v5 z6 |5 I$ X3 Z% W

2 s" H# l' Q3 H  i
  1. <?php % P1 v* |+ Z4 t# \; C0 E0 t
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)7 v9 m: K* E: H
  3. $HOME = dirname(__FILE__);3 p6 Y8 x5 z' Q0 v( v' T9 a* X
  4. // 如果是Windows系统,修改为:$WIN = 1;! O) v/ b6 Y( T5 Y7 }# }" a( `$ m8 g
  5. $WIN = 0;
    * Z5 U8 m0 ?+ l* o6 I
  6. ?>
    7 {% K" {$ o' G, J1 H
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    $ d# e! W  v, J( e7 y( D
  8. <html xmlns="http://www.w3.org/1999/xhtml">; C) q7 {, h, e  g
  9. <head>
    ! Z) b$ D# {, E9 m2 @
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    . W& J8 c8 ~1 I/ M5 A! c
  11. <title>UTF8 BOM 清除器</title>
    + w, f/ R" P$ ?5 A! B
  12. <style>+ |! o, `- r/ Z. A8 x
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }5 b, z0 ]: \6 @' \8 N7 v3 u  n! i
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 Y% a; @& C9 g% z8 j
  15. </style>
    0 z! o! O) b) B7 F! s3 ~7 x
  16. </head>' C; a1 E" w( J( S( R/ @& i2 \
  17. <body>
    7 b3 P7 t! }$ v
  18. <?php( N) ]) m, V9 [+ \" \0 |5 S
  19. $BOMBED = array();# K' ~" H5 z" b" P7 {
  20. RecursiveFolder($HOME);$ E! x8 Y7 _( u8 i7 c
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ( V& ~. y  J% `. z$ ?0 P
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }; m3 {& F: I* k1 b- o6 V- k" g
  23. echo '</p>';" P3 Z2 b3 `5 i. b7 B( m; w
  24. // 递归扫描2 |5 S- A. ?; L: [0 E
  25. function RecursiveFolder($sHOME) {
    ) i0 k6 Z  T7 G+ C8 K% v
  26. global $BOMBED, $WIN;
    % ~6 n& J$ b, U+ i9 `- n9 R
  27. $win32 = ($WIN == 1) ? "\" : "/";, V; g, I* Y. R7 ^, @  P" Q9 t" r: `
  28. $folder = dir($sHOME);1 h" f$ y  m7 n7 q+ D$ m+ E6 ]6 t5 Q
  29. $foundfolders = array();
    % m% E. @) A8 r" F* n- f8 H. }
  30. while ($file = $folder->read()) {$ J8 s) J: l, R$ h
  31.   if($file != "." and $file != "..") {
    ) U% d: P  r6 S3 ?9 c' e" i
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){' J: z0 ~: {2 w2 t7 d
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    5 R8 d, ~1 u. K: d0 y
  34.    } else {8 ?. q4 i" _: h
  35.     $content = file_get_contents($sHOME . $win32 . $file);1 ?- \$ [+ G. r& d3 X5 f0 B2 t5 ^
  36.     $BOM = SearchBOM($content);
    4 Y& G) \9 h1 N1 V" H# q
  37.     if ($BOM) {  S( h  r- `" ?; H7 K8 n; b1 M& L. d
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;% E, J+ V  }! V) k  f5 v1 f. c1 T2 y
  39.      // 移出BOM信息/ Q0 B; d* Y" M: D" ?; P
  40.      $content = substr($content,3);: N5 S& [4 [+ h- ^+ |3 @
  41.      // 写回到原始文件: R6 N0 P6 h$ i. r
  42.      file_put_contents($sHOME . $win32 . $file, $content);
      ^% o1 `3 }6 ?0 }0 U
  43.     }
    & Q$ s  u2 V# ]; ?. w3 \5 S
  44.    }5 Y4 u/ b- q' f' M
  45.   }
    2 d3 e( D' H8 {* b4 m
  46. }2 j; l; n6 y3 f0 Y  Q
  47. $folder->close();
    5 e0 ^( R) N1 [, I3 N7 _. t
  48. if(count($foundfolders) > 0) {' F2 d1 Z5 S  J/ T2 r9 F) d
  49.   foreach ($foundfolders as $folder) {
    5 H% Z- s4 j; g9 q! x* P' g
  50.    RecursiveFolder($folder, $win32);
    2 ?4 e# X4 T3 H/ S5 w% E3 h
  51.   }
    8 [# L5 z. J; X3 X$ [
  52. }+ h( u. y/ d3 W4 H, ~
  53. }9 d( z) B; A  D2 C
  54. // 搜索当前文件是否有BOM4 \8 B: y. \- m" Z5 D. R
  55. function SearchBOM($string) { % R, e8 t5 F: }, D& G' L
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;/ D6 [- s8 G/ i7 j4 a
  57.   return false; 4 c5 |# A$ E1 h$ o/ _1 z+ b. f" N
  58. }" Y' `' w+ V8 q" y
  59. ?>0 \+ ~) H2 N8 Z7 Q# H
  60. </body>
    1 ^1 H1 Q) H# x1 T% b& K3 B- ]
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!" ]8 [1 y) [, O& }$ Z1 _: H

8 U5 h" w4 U% R! D1 {' h$ n# ?

本帖子中包含更多资源

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

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.