开启左侧

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

  [复制链接]
66066 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  - H* G4 c( w+ j4 B8 `% V$ J& l

* `0 N; e. ~6 P# A! e# p* B这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
2 T' T5 o' }6 l9 s- y6 x% J: \8 k6 \3 _. K% F  r; J* P
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。0 d7 Y$ r  @, {3 k

# Z5 Z& |1 T+ d对于一般的文件,这样并不会产生什么麻烦。
' G& @' @6 u& L
) A, I4 }$ z7 N+ V# Y% q但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。5 g+ s2 H0 P' s5 S7 ]9 n
3 @' E6 P4 O% n4 k& \
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
) x7 P/ i9 s1 f, V9 ?
! n, u) c0 K8 c5 o1 @( [由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!" f5 Z! T; q4 ]6 S. H2 K5 {
, b4 [) V0 `. J& I2 ?' l6 `
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
% ?5 _& d. k/ l( i) F" ~. T' K( v$ |; x$ a
然而文件比较多,又想偷懒下,使用下列方法来实现。  " }5 u& `7 ]! m' i) Z. V4 Z4 ]- U
8 V) o: C$ q5 i  q' l4 f& D
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
$ [! h5 T% v" d, w3 U. q+ m2 q8 Q" z6 D8 E' O

% M. l0 h) H* J8 M1 L
  1. <?php
    6 _$ t& d. J5 e3 r7 A- W: `; n
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    5 F8 w  B+ S  Y" O  b
  3. $HOME = dirname(__FILE__);5 u. Q1 @" H5 \; v/ V
  4. // 如果是Windows系统,修改为:$WIN = 1;: @5 B& }( e9 f! J- T  e0 A& L
  5. $WIN = 0;4 A3 `" H/ n% i  J+ f
  6. ?>
    5 _5 I4 @9 u4 d& d- K7 L
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) @2 Y2 I6 ^. Z8 a
  8. <html xmlns="http://www.w3.org/1999/xhtml">9 I* C) o' |; I4 e6 ]+ I7 i
  9. <head>* p5 w) f' M' \! b* I5 y
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /># S6 }) m, }8 B1 p( K
  11. <title>UTF8 BOM 清除器</title>
    1 H7 k% ~8 _  G1 B, Y1 a- Q, q
  12. <style>% V  \8 f) F& K+ ~- Y3 R
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    # w5 ^4 n5 V6 N$ ^/ {$ I7 f" v$ ]
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ) M8 _( V. O2 t9 c1 z' ]
  15. </style>7 V( _  s6 `: N! t5 g
  16. </head>: Y0 n9 @3 G/ P0 y0 t! {" R
  17. <body>
    : G" R" `! ~) e9 L- D3 j
  18. <?php2 X. ?" x. U" w; C9 n7 p# t( F
  19. $BOMBED = array();* c& ]3 y' n- @9 p
  20. RecursiveFolder($HOME);  p6 {% _0 M; C* e* U" I0 b
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';9 ?* Y& Q1 r2 z$ ~3 T* a
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    " i7 L# I7 W# O2 u& x3 w5 i
  23. echo '</p>';
    5 D/ N2 c: y8 w% u
  24. // 递归扫描( @0 S5 a; H7 U7 O+ m$ J$ w
  25. function RecursiveFolder($sHOME) {6 l7 R: ^+ W0 I' @( @
  26. global $BOMBED, $WIN;
    0 y0 y  I9 Y  J$ n
  27. $win32 = ($WIN == 1) ? "\" : "/";$ [4 B- Y1 ?& D' H- v; ]
  28. $folder = dir($sHOME);
    0 A- E" E5 J; V
  29. $foundfolders = array();. E- l2 L- Q  x& `# ~3 F
  30. while ($file = $folder->read()) {' {; R2 x9 ^  P7 T" C1 E2 H6 }# F
  31.   if($file != "." and $file != "..") {
    3 z7 V( [7 C) Q9 R  d
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){$ N, v( l. S( Y4 Y1 V9 ~$ w" }
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;6 M, C! p) i9 I
  34.    } else {
    $ ?4 S' b* N; J8 t
  35.     $content = file_get_contents($sHOME . $win32 . $file);/ |5 B( R9 \# I# H+ s5 M
  36.     $BOM = SearchBOM($content);
    / d6 A( g: m8 J7 n) ^: L  E( R
  37.     if ($BOM) {
    ( g) `4 x- W1 M3 B, C% j) z: P0 A
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    1 ?: a8 I! A# O& d7 o  M
  39.      // 移出BOM信息8 [2 Q" G9 ?' E1 K; Q  P. d
  40.      $content = substr($content,3);" e( d- r: {7 q8 D4 m3 u, q
  41.      // 写回到原始文件
    - S6 \# p; ~- m: A
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    4 K3 l2 J* `2 _( b5 ~9 G
  43.     }. @0 u' V1 Z# a# O
  44.    }% Z/ k* _) t. }* L7 I; v1 J& N- [
  45.   }
    + f8 R, [* t; G7 \& ]
  46. }7 g% R" u$ o, `4 T6 s! n/ i
  47. $folder->close();. g* A, z( l# P
  48. if(count($foundfolders) > 0) {
    + n9 @7 k2 A4 O1 H; T6 v
  49.   foreach ($foundfolders as $folder) {
    / F& b# P/ ~% \) {5 A% l
  50.    RecursiveFolder($folder, $win32);
    : ^) p9 G% \, i8 Y* h% r( ~; C
  51.   }
    $ a. g, j  B* \
  52. }
    " y; J- G& d4 u8 L( C( C
  53. }) _" r9 X0 @+ o
  54. // 搜索当前文件是否有BOM" K/ b  N1 A9 B8 q3 E2 Y
  55. function SearchBOM($string) {
    0 X: b% v2 o6 }
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;7 B3 j# q, Y- k( A8 N  m7 F6 h
  57.   return false;
    " U4 d: h, @; |* w! W' U3 p) i6 ?, G1 I
  58. }
      J. j* d3 Z; c: L* ?
  59. ?>
    : A: @8 o7 Q( L6 e/ w. B8 M
  60. </body>2 p5 i3 d8 A) n, ^' A, g
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
* C8 p* Q" ~' }2 e8 h0 m( ?
+ R0 v2 q: y2 |  m, _+ w4 e# q

本帖子中包含更多资源

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

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.