开启左侧

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

  [复制链接]
58316 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
! S5 Z* t3 F( ^2 t; ^/ Q
2 M: q( n) ?2 F: y( |这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
; `7 y* F; D) |
! w1 r( k$ B0 z" y! X它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
" _$ f% Y) G. K1 v  m) {
4 z( _4 z/ |- @+ v8 V' E* C对于一般的文件,这样并不会产生什么麻烦。) \. {4 x& {' i$ V

: c  D+ o$ c$ G; D$ x8 n但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
5 e5 ]9 v) c5 n/ U- Z% E9 w# S# h. G, D8 i
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。0 K2 f3 c4 p* K( ]% u# F: \; f

$ ~7 @& [! s. Z' \8 u3 D9 V" [) e由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!+ ?) @- e9 b+ Y0 n

" k. Z5 ]4 s9 H* s3 W$ Z9 I8 |直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
# U& s) l( P/ @9 ]' m+ M3 q0 f
+ c# A% \" Q" o; W1 ^然而文件比较多,又想偷懒下,使用下列方法来实现。  
0 E$ g: g2 ~4 V* X( s7 |' t: I* t6 d$ c. t& b5 \  W
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换8 G4 _. R0 G6 ~" O2 m& ~7 x
# s* t/ {, y  ~$ F4 T2 D
6 q/ O% u1 g. i% }
  1. <?php
    ' e" h& k4 M0 ~7 h5 \$ f# I
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    6 J4 J9 G/ \1 a6 f3 w+ b
  3. $HOME = dirname(__FILE__);1 ~: n, l9 T. U& X6 q3 q2 j0 D
  4. // 如果是Windows系统,修改为:$WIN = 1;
    $ l: R2 W1 g0 N1 U" }# ?6 N
  5. $WIN = 0;% S" C1 R1 O; q8 d, R$ S
  6. ?>
    5 S* n7 N  r2 c. N& C% |7 y
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    - J/ q3 t8 m# a- l
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ; h% b% q5 ?7 j: t4 E$ I: ~2 ~
  9. <head>' q7 t5 |$ o. y! k1 [2 s; |
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4 z0 g, m, a2 \5 q+ C4 n! m9 w
  11. <title>UTF8 BOM 清除器</title>
    , I  x! q' Z1 J( c% \+ M9 h& D
  12. <style>
    $ ?4 k8 E% E- s# J, N. ^. q
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }, {; ?, B" X/ M& _
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ; t3 h1 Z! P" U  j7 u; l
  15. </style>2 t7 ]" G0 A: o- Z$ M( W' Q( c
  16. </head>+ E# C) D: o5 u9 e/ l, \% K
  17. <body>
    / M, C9 c4 T9 _, ]& \% q
  18. <?php
    1 R7 w& ?, z9 o6 w( E& v
  19. $BOMBED = array();+ ]" G$ |1 o+ V" L9 }3 W9 B
  20. RecursiveFolder($HOME);
    7 v3 E" v* q5 w4 @+ C3 q* m
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    - B5 C! \. }/ r+ g. S4 z7 R
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }# C7 D% G3 w2 a2 C4 A, |& t
  23. echo '</p>';5 c2 N% s% E7 `! e+ y- R0 r
  24. // 递归扫描
    9 b  {* h# K/ R6 n
  25. function RecursiveFolder($sHOME) {" }$ T1 T; P) J4 {
  26. global $BOMBED, $WIN;% G7 r$ c9 t7 P# @! Q+ b
  27. $win32 = ($WIN == 1) ? "\" : "/";2 A. R" m1 L' m- ?  Y( `
  28. $folder = dir($sHOME);
    4 I1 w. Y$ }. c' Q
  29. $foundfolders = array();
    3 d$ A. L5 X$ h( y; W
  30. while ($file = $folder->read()) {! m, `% H4 N+ j( h: j% t4 ?6 b
  31.   if($file != "." and $file != "..") {# P( c9 W) {. c8 J, z
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){3 O3 D/ S2 M4 ~; N% n, y0 t' u% k
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    3 B2 M1 z! Y& w6 C
  34.    } else {* l) v1 O" |; g& d( I8 Q8 O  r
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    9 U& G) f, X- E4 D: Z! Q
  36.     $BOM = SearchBOM($content);1 y- r5 m1 B8 R4 F  W' x
  37.     if ($BOM) {
    $ L4 n2 m; x) @, ^5 T2 |
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    $ i; E1 h' g* c1 f
  39.      // 移出BOM信息
    8 N% V) `* h- N1 C* \* o7 ^
  40.      $content = substr($content,3);4 ^( q9 s0 [2 c" U* |
  41.      // 写回到原始文件
    0 C/ m6 E, y8 e" j2 W/ E
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    2 h: N$ R+ f/ \- I* A
  43.     }: N* r2 w. w1 Y, w! H. l
  44.    }) Y# U  {" b3 j( e! b- o, b
  45.   }
    ' F- z* Y6 d2 f( y% s0 A3 H
  46. }
    1 }, [9 q6 N3 L2 o6 {/ y+ v' `
  47. $folder->close();
    $ R$ T/ g4 D  h" |& l0 P$ G0 {
  48. if(count($foundfolders) > 0) {4 G4 p: ]) k0 Y% q8 h: \( P
  49.   foreach ($foundfolders as $folder) {5 G4 S4 N4 \1 M2 |, B
  50.    RecursiveFolder($folder, $win32);9 [8 L. o, E/ k
  51.   }
    7 K6 |; J. ], W% K
  52. }
    # M* ?/ a' g. x; ^
  53. }$ V2 G0 Y# t" n
  54. // 搜索当前文件是否有BOM' J7 M* M+ v9 l
  55. function SearchBOM($string) { " m' }  w; C' q; @2 ]; G
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;) f- S: ~2 ]# k
  57.   return false;
    , r2 y1 q3 N/ N2 l0 A1 U' C" i* V
  58. }
    & L- c2 V/ ^- x" l5 C4 }9 F
  59. ?>* w& ~$ r/ O. W9 T5 o" ?
  60. </body>0 j% C: _' k& Q5 n" B4 t
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!& S1 ?5 t. B" G% K; Q) I, e+ r$ u
" I7 Z" Y, s! l9 w! \& V4 k

本帖子中包含更多资源

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

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.