开启左侧

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

  [复制链接]
67447 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
3 i) x5 a" {  s  v3 l& b1 n% M$ R1 R4 u1 M3 S
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。5 `1 E# n# `$ `' f

: b9 ]! T7 g3 e. I8 o- `6 W它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。) D& Q8 E2 G; \& _/ `1 x

; C$ \# y$ |& c对于一般的文件,这样并不会产生什么麻烦。
/ @( g3 g- n8 J2 x8 |0 U" u& j. L6 _! `+ J& [1 C% g  F  u. C5 ]
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。/ J! w) L+ b6 J! [8 w& i1 \0 E
$ k8 v& {3 G" ~: }7 ^* R
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
( m' G1 R  [- V& X2 x4 ~( e- X* [8 @6 U
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!/ ^7 S! s/ s# @- a% e9 e2 B9 X
) }) S$ ^$ q3 h0 p. {" {: Y  K6 ]
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
( _( a( b2 o4 e
/ R6 Z+ P: j( _然而文件比较多,又想偷懒下,使用下列方法来实现。  
4 [5 r. Q% F+ N' R& T/ c5 f9 C* C0 w' q0 |5 ~1 d
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换( E7 x: e" `( ]0 x" W' m$ i

1 G1 y' Y  R. @9 u- P
6 y. S, n0 K; N+ T
  1. <?php
    0 z+ `/ Q) e" `6 h3 D* J# t
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)6 @) i/ T8 A. G6 X) P# f
  3. $HOME = dirname(__FILE__);
    ) e. s  @) D& t! s
  4. // 如果是Windows系统,修改为:$WIN = 1;% `  l9 E3 e7 y* Z9 p5 N) @8 t
  5. $WIN = 0;
    0 n; v" B% w' H3 t: [4 c6 O
  6. ?>( j  ]. K7 ]9 x% X9 Y: T+ a
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+ d% f  X+ r" C& t- N  P) B
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    . Q* e% |/ U3 n) D
  9. <head>
    8 x2 }- c5 d# @" @4 ^; k
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    & [' K# y8 `, c, u$ g
  11. <title>UTF8 BOM 清除器</title>
    , X  m% P5 D$ ]! }8 V
  12. <style>+ ^3 S! @/ h1 v/ j* {' K
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }  u3 V% `( x4 e; e$ |
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    / a$ u1 i' L: i$ u! J
  15. </style>, V$ S) \3 o  L
  16. </head>
    ; S7 k8 S+ C8 W1 g+ K# z' B
  17. <body>
    0 s* z9 F' k6 S
  18. <?php7 P- x& F+ \8 h0 x# |
  19. $BOMBED = array();9 |/ c6 e% m* N: J/ ^0 t6 e
  20. RecursiveFolder($HOME);0 v" j1 m- x2 m; {3 B2 M% O
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    & U  G' d$ l5 T! q: Y& a& \3 d) E
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 h: _, ?0 T0 m8 e
  23. echo '</p>';
    . [0 Y- e. @* ]; i
  24. // 递归扫描2 P2 {2 Q4 r' C+ L. T8 ?4 |( z
  25. function RecursiveFolder($sHOME) {
    ! i: F5 K2 Y; K8 l" U, ]
  26. global $BOMBED, $WIN;
    , I$ A* [. |# l2 l& e
  27. $win32 = ($WIN == 1) ? "\" : "/";
    , k/ P' U$ Y. z2 L+ m9 P
  28. $folder = dir($sHOME);
    7 F$ n! R/ p2 J; `% X; r
  29. $foundfolders = array();$ ~( ]9 o+ S# b* q( t: z" B! r
  30. while ($file = $folder->read()) {
    ( T& D6 ^; b. p/ ]: d! U
  31.   if($file != "." and $file != "..") {
    ; d. b. [# d. F( w, }6 l3 [# e
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){0 j; ~9 F8 Q1 q1 B/ ^7 `
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    : b7 V6 R7 Y* t6 a; |; M
  34.    } else {3 T" y! n3 }, ~
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ) l" k, P1 K2 F8 d1 \0 g, c* k
  36.     $BOM = SearchBOM($content);6 `6 ?  R$ d" r3 o% X
  37.     if ($BOM) {- ~, ^6 ~* R6 u* _5 F; Z
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    & d1 p4 O! g, A0 u) ~
  39.      // 移出BOM信息
    ) u/ d" e8 A8 ^3 z4 F& F9 z* w) r- ~* d
  40.      $content = substr($content,3);
    . Z  S; e5 @. s2 ?# g. J3 V0 g
  41.      // 写回到原始文件
    4 y* Y# y8 p) @
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    - f9 b% y5 n, o. }+ M" X( j3 |& D5 b
  43.     }
    * u1 o- a7 r9 H6 u) Z6 t8 }3 o
  44.    }! O( J$ ]) m8 c
  45.   }
    ! S! N& `" J& c6 W. s
  46. }
    ' W2 |- G9 @0 w5 w; Y% x
  47. $folder->close();$ f- E1 p& e8 w6 H8 g' p
  48. if(count($foundfolders) > 0) {
    ) ?. _7 A) V6 a$ D+ L8 m4 T- e
  49.   foreach ($foundfolders as $folder) {2 j  g5 P4 {" Y8 r+ V" A' p
  50.    RecursiveFolder($folder, $win32);
    0 N$ y9 t' b) G7 t7 _
  51.   }
    + G% f+ z' S6 v
  52. }
    8 x8 L: y* R( _' Z8 {- m4 k
  53. }
    * t: W. N: b9 j! _$ I9 ]
  54. // 搜索当前文件是否有BOM9 ?7 [4 u0 ^9 X+ b4 L  e+ ^
  55. function SearchBOM($string) {
    0 {  t3 Y8 s. y5 [7 z9 Q
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;7 a1 |) T+ U( n0 D8 Q
  57.   return false; & g, I6 W3 ~9 L/ f
  58. }
    . z. `- j  p. w) b- P' Y1 d
  59. ?>1 `: C& H& p1 M6 ]1 p  m- a
  60. </body>; P% y1 a7 d5 ?* z+ p: i
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!: |) j8 U' P6 s, e* t

+ A$ p3 I% P% s7 j9 I: C/ ]' Y

本帖子中包含更多资源

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

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.