开启左侧

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

  [复制链接]
66942 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
6 K* j& S* V3 P, X6 {! _3 f8 d& x! w8 e5 P
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
- A/ ^8 j5 D& J! ?) p. c( j: e
9 f' Q. z) \/ k- i  E: T它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。% }: e1 h# p" t% |- }6 m

' z7 D( G* w$ B对于一般的文件,这样并不会产生什么麻烦。6 q" d" G& K6 Y5 i" r

8 g  v. m- Y  z! b' D3 D% l但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
) q1 f  C- x7 L' _
) U2 k" q9 `4 c5 O- e; Z1 n" u+ A根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。! v7 r7 X# X; m0 d; I5 h. L
# y( Z9 X; k/ r7 f  _6 g# b0 z$ u
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!! u- {! ^0 a$ e' o7 h2 G5 G

+ b: u0 c) ~: l$ j" i/ p  X直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
  k; R8 n) y% a% ]3 p% R  @+ x/ s1 X! y7 E1 N% w  S
然而文件比较多,又想偷懒下,使用下列方法来实现。  
' a# Q9 E; N2 y% |9 m  d% L
, u8 T3 G# e4 m: k将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
  H& _7 S# e9 d3 A- |8 K( v3 G6 n/ g4 F8 d% L4 _+ V, d; a! E% [; I' P, m

, s6 \! \; ]& H( R
  1. <?php 0 u; V: Q$ |/ N$ N: \0 f& O" R  @8 ^6 f
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件). ?; \/ Y/ M/ x! M2 B2 ^, I
  3. $HOME = dirname(__FILE__);4 G" S) g6 f, d4 Q9 F* c$ x3 M" p
  4. // 如果是Windows系统,修改为:$WIN = 1;2 v2 R( p" a) j, a! H# m
  5. $WIN = 0;
    : z. u/ t9 d1 d$ T
  6. ?>, M6 f- Y6 L9 Y& R7 G% x
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    : f. s$ l+ y' A2 S/ h' T/ x. X6 F
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    6 w9 |! s  a+ ^6 N" o
  9. <head>
    % r3 h/ U: I- m! C# A
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    9 x$ s) ]4 |8 i, O$ N7 A0 ^/ w+ s
  11. <title>UTF8 BOM 清除器</title>
    / [8 J: F8 N/ W- |  M/ d" g& D! m. b
  12. <style>
    , \6 L! h0 j3 A$ ^) N
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ' Y  Q% l1 k0 }
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    5 C2 `( x# Z' p' k! z& N
  15. </style>
    # M) s, l6 I  X3 `
  16. </head>: w% O! F' `4 a+ n
  17. <body>
    , z, I* e9 C+ {6 R. \+ f8 B, ^
  18. <?php# e$ }9 \: x) Q( ]: }
  19. $BOMBED = array();
    8 a: t- K$ p+ d8 ?' P3 `
  20. RecursiveFolder($HOME);
    8 A2 C6 m& \/ ?* Y: D# t$ ]2 d9 ^
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    " ]8 H7 G3 V  Y1 ]: l9 p) c) b' {
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    1 K. d6 A- A$ S
  23. echo '</p>';  D2 D4 s5 x, I$ d. [. y
  24. // 递归扫描
    0 L5 J/ L) p$ P8 X4 H. I7 Y
  25. function RecursiveFolder($sHOME) {
    8 O# r. u- Y, y$ r9 q8 {5 ]
  26. global $BOMBED, $WIN;  b7 X, N# j" r! w
  27. $win32 = ($WIN == 1) ? "\" : "/";
    7 q% q0 X$ s  s0 p
  28. $folder = dir($sHOME);7 i+ L4 h" `' T0 |+ W( Y5 L
  29. $foundfolders = array();
      T) P7 {$ _! E! q( i% ^
  30. while ($file = $folder->read()) {# u6 u& X2 F) J5 k# e5 P5 g. R. W
  31.   if($file != "." and $file != "..") {  d/ q  \3 Q0 `" X/ x
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){& x: E# B$ M2 n" `
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;6 t) k; n% i& u) \
  34.    } else {, S& d1 r4 P' R; {! [9 n4 Y
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    # ~$ J  m% Y) _; W
  36.     $BOM = SearchBOM($content);' i: E9 ?+ C; G) P; z6 t
  37.     if ($BOM) {6 @: l( j$ r+ B- z
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;" C  A0 K: t0 y" U6 n2 `& x  K, ~. ]
  39.      // 移出BOM信息
    2 ]. ?1 P& \' M# r+ Y
  40.      $content = substr($content,3);4 a4 }9 s# ?. r) ~7 I! p  M  g
  41.      // 写回到原始文件: G9 q+ ^0 v. J, J* W
  42.      file_put_contents($sHOME . $win32 . $file, $content);3 a6 P( Q3 t3 e4 d/ A8 W& N- W8 |4 U
  43.     }& v% H1 M$ ]) w8 }! [4 o; ]
  44.    }
    9 A  I/ \) O/ j6 j9 z) X+ o' N0 t  j
  45.   }$ l3 t- q' v% n9 L( [
  46. }
    ( F" h+ p/ z( X8 J, p
  47. $folder->close();
    0 Y6 j# U5 p1 ^6 \6 d: O% U
  48. if(count($foundfolders) > 0) {5 g1 y& K( b% N1 |  r3 J& }0 U
  49.   foreach ($foundfolders as $folder) {' t! T5 D* {( ]* V
  50.    RecursiveFolder($folder, $win32);
    8 S, r7 s/ }' u6 y* H  b( X
  51.   }
    : W, c% T" S" o8 h6 F
  52. }; e( d/ p. {6 d0 |$ R  ?1 ~' J( C% f4 r
  53. }
    % a3 M" t' W; V* C* m& L8 F
  54. // 搜索当前文件是否有BOM3 Y$ D7 b( _+ W. H
  55. function SearchBOM($string) {
    9 n& {3 B+ t; F) O  _) p
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    9 x0 s" u# F3 K. P4 p9 a* @1 v6 `% R$ W% u
  57.   return false; 5 T: \# v' W4 j9 r0 u1 e
  58. }) i- O! J4 h, s. E, |
  59. ?>  |3 m9 Q# I/ S
  60. </body>
    ( j  B' T4 O" L8 K
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!5 _% @+ D7 k& `

3 k3 e. h( F8 P  E

本帖子中包含更多资源

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

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.