开启左侧

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

  [复制链接]
66802 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
( a5 g8 n. E% I" H( Q5 |, f
. L% P# z$ {7 b0 p这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
9 L$ v6 u0 a- ]; z+ O" w( P2 k. k
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。5 r$ D8 \1 U% l4 m  d% M
% P: J: p7 l# a3 t, a6 H8 ^
对于一般的文件,这样并不会产生什么麻烦。
/ b! H3 C) W0 a' M& U6 R9 v: T  M9 H6 h! b+ C) k* _3 {! _
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。' n2 y. D: J% ]. U: c3 Y
' {# {# z4 a) |- K1 b) t; Z6 ^6 E
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。+ u- }: k; }2 X1 c0 Q, A+ i
& ?/ G1 U4 p6 t9 B4 q7 p1 y
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!$ M4 S2 e0 X8 c7 M

8 j% v. i1 G7 U+ U$ [! M直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)     N3 y7 i+ y; M8 J6 N

2 Y, G. ^! Q& v8 u  O( _' {2 j# T然而文件比较多,又想偷懒下,使用下列方法来实现。  
/ L; M7 T  `; {6 o" [
9 N: `+ N: I9 P4 R将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换( C2 x0 M7 d3 u" P0 f0 @9 I; W+ q6 ?7 ?
$ p% J2 r8 M; S
, ^* H: X- x1 u1 S# U
  1. <?php
    ' W7 Z' Z8 R& S& A0 C4 M' s
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    + z6 m  s+ u2 K/ I( G
  3. $HOME = dirname(__FILE__);
    4 a/ i  A3 z) U- E! J
  4. // 如果是Windows系统,修改为:$WIN = 1;2 n% S; P8 Y& E8 J1 w- H( r
  5. $WIN = 0;
      [7 }, k( O/ y2 d
  6. ?>
    , B: u/ F$ K( y8 Q7 u5 f  x7 S7 Y
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">. w- L* A6 x& H. t: ?7 D
  8. <html xmlns="http://www.w3.org/1999/xhtml">' `( r6 z4 O2 M) X5 U( t( a
  9. <head>. j& s* V6 w$ M0 M2 V, l) j
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, |8 `$ }. o: E' d3 o: P# G
  11. <title>UTF8 BOM 清除器</title>
    : D# r4 D4 U! T9 V( s
  12. <style>0 \. ]3 @2 |5 {, I3 V0 F7 k
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    4 I2 Z& S- h1 l: C% p* R) l6 R
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }" o, K$ F; d; \. z1 h) i
  15. </style>
    1 l* V5 k% T2 l# C5 c
  16. </head>
    , ]) B% f3 z! f
  17. <body>
    " F' M$ ]$ T5 k: O! |. Z2 f
  18. <?php+ w( n$ a5 E$ p- n: @  }
  19. $BOMBED = array();  Z: i5 D5 f  @  ?
  20. RecursiveFolder($HOME);) R3 B, e/ m( E! D
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    " M  |% z) P+ d
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }% r% M4 E& z4 b
  23. echo '</p>';5 z: a5 v( W! `+ X& K4 @
  24. // 递归扫描9 q" Q4 j5 C1 r8 f; X) S4 n
  25. function RecursiveFolder($sHOME) {
    $ s9 _+ K, A4 t9 i. k
  26. global $BOMBED, $WIN;
    & c% S, m- Q0 i; r; Y$ L
  27. $win32 = ($WIN == 1) ? "\" : "/";, O: ^" e0 {, A+ c% c. w
  28. $folder = dir($sHOME);' i2 I- P$ g, _
  29. $foundfolders = array();
    * [$ n- I4 A5 Z3 n1 y% ]
  30. while ($file = $folder->read()) {
    . s6 g1 x5 T* b6 z) `
  31.   if($file != "." and $file != "..") {
    ; U2 P5 w4 G/ ~# d$ z' l
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){3 S( c  G4 B8 C5 i3 R7 A# k
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
      v% t3 Q+ |4 i" U# c  u# ~) [* i
  34.    } else {1 Q/ j: h0 O8 x# g# r4 r& _4 S! B
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    0 q: ]* E0 W7 {8 p6 C
  36.     $BOM = SearchBOM($content);; R3 n& G; J$ s6 d7 ]+ Y7 Z: r
  37.     if ($BOM) {( ]0 @: i) Q8 i
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;+ P/ m7 M. o; {; U3 j# `8 r
  39.      // 移出BOM信息$ M0 G6 h' J0 F7 H: O
  40.      $content = substr($content,3);
    ) s. W$ N  P) ~- ^, I) K4 x1 o
  41.      // 写回到原始文件
    3 G2 l) a0 ^) [
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    + C; l8 o. r  B9 o: R" z6 s
  43.     }
    # D# x2 m3 a# [, F% H5 q* P; a/ {
  44.    }# j& o" i  `, l
  45.   }
    : v7 B/ J  d2 u. |5 c/ L8 W
  46. }
    ! J* f& [% q. d  r
  47. $folder->close();+ A' F+ }; D" V' c0 r
  48. if(count($foundfolders) > 0) {* ~+ v! o( U6 o
  49.   foreach ($foundfolders as $folder) {) U  L, T" d7 u8 S- `" I, @- j
  50.    RecursiveFolder($folder, $win32);* d2 g- o( i& v& f$ Q
  51.   }& b: @! K' v/ r; `
  52. }
    / K( m9 P0 D- x) m6 z& C  R# v( t& u
  53. }& N, P7 T- u' p2 g
  54. // 搜索当前文件是否有BOM
    , C; s2 Q# G9 N$ T; J
  55. function SearchBOM($string) { 3 I; M. }+ x7 H- X0 r# Z% U9 j
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;3 R* D( N6 w1 V- x7 L3 I% ~# U
  57.   return false; 3 r" |4 ?( _& d6 R+ \2 ]9 u, D
  58. }: t/ h! V; O( V; ~$ K
  59. ?>
    " N7 O0 P" r1 d' a& Q6 o  V
  60. </body># b: P5 r, ~! t; z6 Q' L3 K, G
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
, [. c/ }6 \  }) i, P, Q
9 P0 s) N( V3 a1 r; W3 ?

本帖子中包含更多资源

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

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.