开启左侧

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

  [复制链接]
61369 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
5 f' i4 y2 X& a% W5 e' A# h6 a7 a+ G( e
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。2 W  h, |: W0 n+ ?

0 M1 B1 z/ j# X, Y  y3 W! f它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
* L5 `8 \7 O$ U, D, u% L: L2 B4 |$ Y, B3 b; L6 W; Q
对于一般的文件,这样并不会产生什么麻烦。
+ [3 J) J; X$ u5 d- n" j. C* D( |% x: ^, O
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。: v7 I0 a0 s1 x  M
/ G' M7 R# b/ p! ?  S) H" V
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
+ {3 R& `! P+ v1 y; R% |
/ a6 F2 b- W/ U由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
- ]$ l' a% {1 b0 O7 m
: l4 ~* |3 d9 A* K  i0 N) b直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
! V# x4 R# n9 K$ {; l5 g
' N/ D0 V- G- x8 X/ ]! [然而文件比较多,又想偷懒下,使用下列方法来实现。  & N, r( X7 Q3 Q, W7 M) i
0 t5 p2 k; H+ V$ I
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# b/ c1 s9 f, D0 k1 h/ E/ Q5 {3 y3 y  M) R  Z2 u1 D

9 F+ l( @8 w1 s
  1. <?php * o1 y" `1 A. w! f) t) z. |+ \
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 F) F6 M! j$ X4 W
  3. $HOME = dirname(__FILE__);3 u& q9 _& |+ f' A9 W
  4. // 如果是Windows系统,修改为:$WIN = 1;
    4 V+ u/ k5 E, n$ b) X6 y
  5. $WIN = 0;
    # G; \: w* g/ K) ^& W0 R
  6. ?>
      F" I' X; s+ A5 t! D  e. B  o
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    & H4 v, a7 e9 K/ h. z  k+ t
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    3 u# h* H4 K: j3 ]
  9. <head>
    9 Z- g! u9 h' o* V! w. i5 o
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />: [1 x: @# [5 x$ ~4 y) Q
  11. <title>UTF8 BOM 清除器</title>/ K  C5 s5 ]% a% s; W
  12. <style>, C3 Y8 c, N. L7 M6 t
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    2 _9 V7 {. B: M( k: {, }5 @
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }- K' U& F+ ]! n9 U8 C+ ]
  15. </style>- `+ B- c! @+ M0 P' A9 b/ Z
  16. </head>
    9 L( B$ T/ U' X( D: l+ ]& n2 z  R
  17. <body>8 q5 X! ?5 Y0 P$ D# F' T( }! \
  18. <?php
    8 a$ K' H# v$ R8 H7 X6 S! g; l" K- Y9 H
  19. $BOMBED = array();
    + e, i2 \7 J8 T( h
  20. RecursiveFolder($HOME);( h& @( r1 g1 A2 U6 F
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    * |! V" B' p1 H* h, v8 J
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }! m3 c  O2 W4 v  ^3 c7 R. v$ b
  23. echo '</p>';
    8 R3 u' T  c2 a2 S: ^0 Z
  24. // 递归扫描
    8 y7 t& Q. _# ?6 q
  25. function RecursiveFolder($sHOME) {" B" R% c. |. f( a5 O$ q. u4 j, L
  26. global $BOMBED, $WIN;9 v) e$ {1 @& |# H: I
  27. $win32 = ($WIN == 1) ? "\" : "/";, f$ U  ], H" F2 `) @' e! q
  28. $folder = dir($sHOME);1 X6 {2 ^" \9 S! n9 C& w! m
  29. $foundfolders = array();
    # x6 t( z3 z7 g  J* U2 |1 F5 I
  30. while ($file = $folder->read()) {
    8 i  M6 y6 c3 e
  31.   if($file != "." and $file != "..") {
    1 k* J. V( {( ?( o6 l* T! Q7 M
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    " I) K  u7 m: V% L6 c$ n
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;$ t; R4 _& j" X* _9 N2 e. z2 r
  34.    } else {; k3 R4 g& O# W
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ( y( \/ ^2 ?9 d3 }
  36.     $BOM = SearchBOM($content);
    * M- o. U& C, V- s
  37.     if ($BOM) {
    ; D: g  B2 S2 p6 ]5 }3 \# v
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    2 |3 ^: k+ X; k1 m  }! q( u
  39.      // 移出BOM信息
    , o3 |% [, @' D4 M
  40.      $content = substr($content,3);
    ) E7 c7 w+ R/ r5 D
  41.      // 写回到原始文件
    6 ~4 |' `+ s) u$ {% s2 v
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    2 {* l: O. M: S6 M! H+ b+ ?5 O" S
  43.     }
    . }4 `7 ?% M5 W2 q3 W1 B6 b
  44.    }
    5 Z2 H" K+ {9 s0 [
  45.   }
    * z& `! b& E5 y9 u. G. O2 h' y
  46. }
    , g! ^3 p9 w( Y' P. l! c% O3 C& O) F' u7 W
  47. $folder->close();) Z& h: _, I9 U0 o8 v! {0 B! O# p
  48. if(count($foundfolders) > 0) {6 y1 B: i6 N% R4 h& M8 I& s
  49.   foreach ($foundfolders as $folder) {7 K! K( m$ P+ }: ~7 O2 `
  50.    RecursiveFolder($folder, $win32);' I# E( d" I- n: @& T- P
  51.   }1 f; w. J" }0 c5 J6 _! X: t
  52. }
    6 D+ J+ ~; x$ m+ e9 [) h
  53. }3 [1 O- R5 Y, J3 Q% J. }" n3 `
  54. // 搜索当前文件是否有BOM3 x4 {! F+ }' R& L  R0 E
  55. function SearchBOM($string) {
    : _! h& M! a3 P+ F( D; d7 E
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;: Z: T2 |  S& c2 t/ |- |3 k
  57.   return false;
    , U& t& L+ j$ b9 J, X
  58. }" |& g$ F( R* X' b" |# `) S
  59. ?>( z: u2 h; J+ ^& j% V. E- y
  60. </body>4 Q3 ~% c, ~4 L9 G8 W) F
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!/ v2 H" `; l. g& @+ k
0 B: j# }/ u; W* f

本帖子中包含更多资源

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

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.