开启左侧

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

  [复制链接]
66747 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  ; o; f0 e: q! w  T; y
0 F% S5 I7 N: O- V0 T
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。1 T; m; D9 }! x
0 X7 ]0 P- [# c! t: k
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。" a+ U* l' w8 Z9 n5 N, G: b

9 ^0 z6 v- J0 |- l2 L" Y对于一般的文件,这样并不会产生什么麻烦。
( ^0 H9 A) O+ u/ y( G1 U7 c1 F  x$ Y( Y, \
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
; o) Q9 t4 U  a5 U0 Y# n  `+ z( N7 ]' l/ q4 s+ c" A: J" z
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。8 s' P/ `& g; b# X2 m

7 Q9 d' }3 F9 @* `" e# y8 F由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
* R2 A# v. B2 z$ J6 b
2 q3 V4 f2 p, w5 x0 r$ [% t* L直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   + n7 \2 F6 k0 o) K  s3 Q, U

" t- V# b7 N6 f( v  x- `' H7 O! z然而文件比较多,又想偷懒下,使用下列方法来实现。  
* Z4 {. P% }9 P# v# T! u  c) K4 B* W  }1 `, x) L* w! h8 h
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
! C" J  q0 u  P) l* M: y! f+ }0 l* O+ w& C  }" T
) i1 `. u! N! G1 ^
  1. <?php
    7 B: J, L8 Q" Q- E  }  s) i
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    1 E& F1 d8 b% A1 b) k  n6 t% d8 z
  3. $HOME = dirname(__FILE__);7 |* y4 l  V4 B' b% L- G
  4. // 如果是Windows系统,修改为:$WIN = 1;7 ~) z* f6 `) N6 z, z8 z& t
  5. $WIN = 0;
    4 }1 U" j' \& T0 V! V# I9 A4 c
  6. ?>
    ( `# a# K! ~3 I; ?7 c4 w/ s
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    3 o' _; {& ~9 v# A* n
  8. <html xmlns="http://www.w3.org/1999/xhtml">0 `# w/ b9 Q7 b4 S0 L
  9. <head>' g  [/ i) `* d
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ) y+ R8 f) ]/ E& N: b- Y( ^, {
  11. <title>UTF8 BOM 清除器</title>
      u$ z6 d% ^7 R* g; l. G! X
  12. <style>6 T* u2 d4 ?+ c- R
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }4 `1 K0 V+ ]5 M& u; @
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ' ~, \/ N' B6 `# E! x
  15. </style>
    0 Y! p6 l& [$ U0 S  \
  16. </head>
    ; {* ]0 ^$ L# U5 G2 z
  17. <body>
    8 L# T0 B# E, u- [& X
  18. <?php
    ( j+ y9 c1 o% s+ B# J2 Q5 \
  19. $BOMBED = array();8 `& L4 Q, f3 u' B, T  L& k9 K
  20. RecursiveFolder($HOME);
    $ S  u5 D4 o& T/ i8 K7 B9 d7 h
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';9 U6 [! t8 }  t6 t
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 u7 D8 A3 p0 H5 J( e7 Z2 L1 P/ M
  23. echo '</p>';+ Y. F+ \6 |+ _7 H. @) V! p
  24. // 递归扫描
    ( y3 d; a* \6 x) C9 J4 _7 ~4 S
  25. function RecursiveFolder($sHOME) {6 x  s" ^: g3 u* @% j* y
  26. global $BOMBED, $WIN;2 v) u9 n8 C) Q. n. _
  27. $win32 = ($WIN == 1) ? "\" : "/";* o; Y9 V, j$ o6 q# U
  28. $folder = dir($sHOME);
    6 O& _7 Y: Q: T! z8 d- @
  29. $foundfolders = array();1 h; R7 G, z, h( C
  30. while ($file = $folder->read()) {  ]9 Y$ \) i# q" B$ q; H; j2 D
  31.   if($file != "." and $file != "..") {& f! o: I. Z* g6 Y$ Y, i6 _+ B
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    ) E1 W, t' H, s, Z+ ~& W/ q
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;# k5 v* j  x' @& r9 T+ `+ C
  34.    } else {' H( c, x* J/ K1 ]; {
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ) a( w  ^" K0 H3 g$ e9 l. |+ e
  36.     $BOM = SearchBOM($content);
    % d1 N9 b; o" V
  37.     if ($BOM) {$ i* B0 o. e) h( f3 M* o% [
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;) B. K1 S+ Y. p5 e/ h* t( W
  39.      // 移出BOM信息
    % T# R0 B2 |, e* x1 M
  40.      $content = substr($content,3);
    ( ]; x/ ~7 t' O( T( s4 T
  41.      // 写回到原始文件
    * k9 Y" }: I( s3 b' m
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ' g' G/ \$ y& T& k1 q8 T9 |" K2 A
  43.     }* R7 Q5 z1 ~3 g! o# O0 J
  44.    }6 I3 c/ l, e+ X5 k* a- {
  45.   }0 D! \+ E6 h$ ?0 N; ]5 A
  46. }
    * t& n+ c) f0 \
  47. $folder->close();( {* U7 B' O" o2 x  X; M% }  Z& i1 {
  48. if(count($foundfolders) > 0) {
      Y, F( V7 \; t6 M( k: o' i- c
  49.   foreach ($foundfolders as $folder) {  v! N3 R. }$ B$ `* W. Z
  50.    RecursiveFolder($folder, $win32);
    - s* G5 \4 m/ t4 E6 |  J
  51.   }: H3 \" v3 @+ j% K" `6 F# F
  52. }
    * i. A- I! |! S% I5 I4 r/ m
  53. }& a  K" T8 Z3 w7 t! b
  54. // 搜索当前文件是否有BOM1 x5 A1 Q% G/ Z' M8 |
  55. function SearchBOM($string) {
    # C0 B- Z- w% U# W8 S/ N$ N9 K$ \
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    " V, |* K* J" o- f- T- G# N
  57.   return false; 3 o4 H9 i6 A" u, Q
  58. }
    ! r' o0 e! u7 _% `4 h+ U0 k
  59. ?>
    # f1 H  \4 x% |7 j
  60. </body>
    ' R$ g; F3 @. W* q
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!% B* O" C# g/ b% \7 j# a
0 N" z/ ~9 _' h2 H3 l1 M8 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.