开启左侧

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

  [复制链接]
58841 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
2 }5 Y" k- V- a6 l
  a% f: N9 @3 B" m7 @: {2 [( b这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
$ l9 S2 I, V* U- p% E, q2 C0 o( ~- a; A
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。8 F6 k8 i: R& M$ c( ~: W7 k
/ @& y3 ~, L: B
对于一般的文件,这样并不会产生什么麻烦。
0 G# ?6 h7 h8 J0 z+ q: b0 q1 f* I3 a5 ^! N9 L2 |6 f- W/ R( ?
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。- c" I7 q" A0 V8 `& C
7 e+ J" ?/ e& f
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 G) w' p! Y0 \* N" g$ E
- [% M: V) v% @7 N3 g2 O
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!7 V9 R; F0 n1 Z5 W

* l  s- \3 w3 @' x7 D, i9 M直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
, K1 X1 T) I, F
# J9 g: ~) @7 X" t然而文件比较多,又想偷懒下,使用下列方法来实现。  
9 e# U2 F  C& ~+ b# @+ g5 B8 i2 F' U6 H7 @
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# S- \" r& {$ R. n( z
' ~4 D$ m2 D$ `! ]
  H# P0 k, Y% m* {% L
  1. <?php 9 X+ V  V% ], |/ I& S; I& ?
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)/ `* a2 `+ r6 Q. w7 z: R0 S* a
  3. $HOME = dirname(__FILE__);6 m2 K, a) `% J. i1 u
  4. // 如果是Windows系统,修改为:$WIN = 1;
    , J  v/ ?: N: B
  5. $WIN = 0;. F$ Z, w* N. _5 G
  6. ?># O- G6 ^4 u4 u9 i
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    % b, t* ^) S" M, U% R
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    5 p, c; N; H* l# H
  9. <head>
    ! d/ `5 {& M2 o6 R  Q$ F# K" Q3 C- G
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    + D. B1 [0 G+ p* x) @: ~; p0 r$ w
  11. <title>UTF8 BOM 清除器</title>+ `% a3 q* L. f. E( \
  12. <style>
    ! @0 g& W, t/ u1 z: e
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }- ?" L! B, o# O  c( V8 _6 k
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }5 I5 p: ~6 d1 c* p
  15. </style>
    * N% b, o% e: O
  16. </head>
    ; H: e, @5 g. Q/ l; Y' P
  17. <body>, }0 u( |9 `" K( Z( v: s5 o
  18. <?php. F9 g2 ^+ z/ X* \. M- E2 R. l
  19. $BOMBED = array();' L1 }8 C% H, j: t: W7 j5 r. E6 p& ?% c% X
  20. RecursiveFolder($HOME);
    % U& k; p( N6 L/ Q( L
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';. o" S. J- Q: ?
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }7 ~" e2 \# C1 h: U; n5 L  A
  23. echo '</p>';7 v/ x1 A) t# c1 }& f0 [. X: H+ B
  24. // 递归扫描% h% i2 H9 X7 w2 T
  25. function RecursiveFolder($sHOME) {
    ; a, t: Z, Y: P! s% J) [( \) B) T+ Y
  26. global $BOMBED, $WIN;8 o& t$ l! h; y% }* _
  27. $win32 = ($WIN == 1) ? "\" : "/";* i& l0 Q" k& v  n3 M% K
  28. $folder = dir($sHOME);
    - s0 T: m7 e$ A2 T" y6 L- t- Q
  29. $foundfolders = array();
    9 N+ L4 e1 y9 D7 g- {
  30. while ($file = $folder->read()) {. c1 x! V* \  N; v% Z
  31.   if($file != "." and $file != "..") {
    & ^8 @- O9 I: D+ [2 D) [
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){2 y8 }& y. i9 |
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    & u7 [3 G* T0 a6 D/ q
  34.    } else {
    / m' K+ `. Q1 I' D$ s
  35.     $content = file_get_contents($sHOME . $win32 . $file);
      E9 y3 d: @! y+ c% m: L
  36.     $BOM = SearchBOM($content);/ o3 O- ^- P" H" ^9 s7 S* V3 B/ E
  37.     if ($BOM) {
    , B# X6 v8 }6 r: e( p
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;. Q# z. a! j$ R0 x
  39.      // 移出BOM信息0 [/ C, p& z) J# |( ?& S- S
  40.      $content = substr($content,3);2 M7 E5 R5 p% A: Y( J2 r; Q
  41.      // 写回到原始文件
    7 I$ j4 e$ c9 @" R# [1 k6 c9 g
  42.      file_put_contents($sHOME . $win32 . $file, $content);+ t. j7 }/ B3 |2 o6 V2 }4 E  N
  43.     }! r1 m' D* G1 \5 C# i! }
  44.    }
    8 g' O6 b9 G6 x5 s
  45.   }
    - X7 J+ t% T- ^
  46. }' u* j# i* n9 k/ o; D# x
  47. $folder->close();
    " x# O( n7 {! T; S: T: D% _
  48. if(count($foundfolders) > 0) {
    , l3 z& u, Z8 Y. c' a( t
  49.   foreach ($foundfolders as $folder) {
    / e" K  k" a4 U  [
  50.    RecursiveFolder($folder, $win32);# s- J# `; {! U* o
  51.   }
    - d+ a3 d5 y* {) A# v) G
  52. }4 k8 j+ G( c9 `# {, o6 M$ t5 \
  53. }% e; f& j& I" h! C. E
  54. // 搜索当前文件是否有BOM( L$ `' v% y1 k) l; u8 [
  55. function SearchBOM($string) {   w; B9 e, U3 c2 m2 t! a2 k
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;5 T! X( a$ x2 D/ e7 y2 h: F
  57.   return false; # X# [- ^/ X+ T0 h8 T; e( L
  58. }
    % p. k  T. Q+ E. H" P) f. ^
  59. ?>
    . ?0 x$ r, X. h0 e4 a8 r% s5 Q' Q7 q
  60. </body>
    . b2 K* C$ E: g$ A! v
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!2 R: C. C6 ^; D  ~
' E+ O6 g, W6 g- O6 I% i/ h' y

本帖子中包含更多资源

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

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.