开启左侧

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

  [复制链接]
62808 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
+ l& `. P3 p: Q  z; ?  c4 E3 ~) I& p' X" V7 `
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: y& F3 F# s! r) |1 M! J' V6 s

* k9 O& e. _! \, w6 z它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
. {/ j. @1 E* e+ w0 J5 R, b7 ?# e7 r4 Y
对于一般的文件,这样并不会产生什么麻烦。
( {6 `( C5 p' D5 e. V5 |/ @; z2 J" v" F6 L0 F2 s% m
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。  e* i) d% Q- v" d! U# P+ G7 b

/ e: m/ w8 a- y* a% F根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
& k2 {% ^8 G- y2 y
) c' b% Z3 X! }$ R由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
; v% ]6 D; r% F- d% @6 U- Q9 X4 b3 }  ]( s$ H7 b
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
" p( P$ \  o  A. X/ S& L. Z" |
9 B) F' r+ A3 Q& O7 i( J) ?2 r然而文件比较多,又想偷懒下,使用下列方法来实现。  
4 @7 F; m! G: r/ X* P8 r& ?$ @2 ?( G6 d! e
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
6 Y! |. [& R& A  _
- a4 x6 o" ^$ Z3 k6 N- x7 G0 z4 ?! I' D
  1. <?php
    - ~& a4 s  y) R0 C# x. U" H- z
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    6 B. ~% e' D3 p) {9 x
  3. $HOME = dirname(__FILE__);
    $ f2 d7 k/ g, n/ N5 A
  4. // 如果是Windows系统,修改为:$WIN = 1;
    6 B1 {1 q" U2 ]3 r, N
  5. $WIN = 0;
      F* e5 a% v/ o: N3 ?$ M# X
  6. ?>
      x5 Q8 h2 h$ u8 L8 A
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    9 m4 K- K3 m, J2 N# X9 N! ?
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    4 P8 E0 _/ U+ r
  9. <head>
    : A+ `3 o4 |5 {1 v$ `% ]* E
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    9 i9 T& r6 |4 u4 ]& l
  11. <title>UTF8 BOM 清除器</title>
    ) x# c8 c0 P+ H" f3 [1 G+ C
  12. <style>  T3 A* T; Q* f0 a
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    7 c2 g; j. Q! @( _; I
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ' Q, f$ H+ z6 T0 M% Y* [) |
  15. </style>: u8 e) q0 ~* i$ v* [
  16. </head>
    , w9 f3 ]* B. ~3 z' f3 r
  17. <body>0 @2 T/ s# _0 H* S7 p0 }( P
  18. <?php5 F! }+ O% S) B- c
  19. $BOMBED = array();
    7 c6 \  _6 F3 Z6 P( r- v
  20. RecursiveFolder($HOME);- e  y5 x9 j  r3 h' I
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    9 s' a7 U/ P0 {# o$ H) ?5 I  ]( z4 a
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    % O/ a8 K8 G1 `, R1 |$ `
  23. echo '</p>';
    - N: I: h- f3 A" e( h$ `
  24. // 递归扫描
    " e) ~6 ~6 t. D) S3 F/ o
  25. function RecursiveFolder($sHOME) {
    - h+ J6 g+ |, _
  26. global $BOMBED, $WIN;
    5 q' d/ \# x# u6 g
  27. $win32 = ($WIN == 1) ? "\" : "/";
    % I* q6 z. P# P1 o
  28. $folder = dir($sHOME);  H; s( s7 f% C  ]& t
  29. $foundfolders = array();4 F" z- q9 s6 Y
  30. while ($file = $folder->read()) {
    4 u1 a" O6 S% B7 n- ]; n& H+ k0 m
  31.   if($file != "." and $file != "..") {2 v7 s/ l/ ^8 z: h: f3 u' n" a
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){2 o; ^1 H; F' b5 C1 d3 N; U+ _
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;7 q0 j3 g" r5 k# b  \
  34.    } else {
    4 n4 ~( M6 }! s  Y
  35.     $content = file_get_contents($sHOME . $win32 . $file);4 P( I1 h) T' [& Y6 }, I$ y
  36.     $BOM = SearchBOM($content);# ]' A; A! p4 d
  37.     if ($BOM) {
    & z* m2 }! M! J+ q# w6 Y
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    . E* S3 Y% D7 r! u. j% g
  39.      // 移出BOM信息
    % a5 k6 [' v+ N7 i6 f
  40.      $content = substr($content,3);) k' x& E% o7 l  y- S( ~
  41.      // 写回到原始文件
    # }3 D0 L. p. A: w
  42.      file_put_contents($sHOME . $win32 . $file, $content);% Y$ L# a1 [$ R) y! S6 O6 ]
  43.     }$ l. g  C- [3 z: `6 U' L
  44.    }/ W. }* L, l$ F3 g( s5 q, d
  45.   }% ?) ^" M: k* D
  46. }
    0 L8 L7 f2 o1 t
  47. $folder->close();
    + [9 k5 x' f$ ^/ h
  48. if(count($foundfolders) > 0) {: z# L  [0 C9 D. g1 o
  49.   foreach ($foundfolders as $folder) {
      |5 u2 O- }+ r/ Y7 S
  50.    RecursiveFolder($folder, $win32);
    " h; t4 J" g6 C. T
  51.   }
    ; C% y& z- u: ]' o5 u
  52. }
    ' O' Z& y$ J) D" @
  53. }
    4 V* z7 t* G. L( {, n% O
  54. // 搜索当前文件是否有BOM
    - T! a. @# K$ z! P. I
  55. function SearchBOM($string) {
    % n* z) B/ _+ H8 y" i& M7 W, w
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;. ]4 I3 h. {$ O- a
  57.   return false; 7 x  e4 s$ V2 u
  58. }
    % d; n- v! h9 J( Z4 ~/ m6 j; A) S
  59. ?>
    3 A  O& R6 {# `) @' ^3 H/ }* t
  60. </body>6 W/ K! O6 t+ Q/ o" n' T. u, A7 b
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!- q- p1 j# L: G/ C5 {" u
. I. K* i0 s# Y: {' 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.