开启左侧

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

  [复制链接]
61370 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  , j: j  L5 R( q3 y" z7 I- D/ Y

4 _% z2 {( r- `6 Z1 ]6 D这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
3 ^* j- Y* r1 T, E0 E- {# d" z5 h) ~# U2 g4 D( r" c& Y0 y
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
. @. \/ Q) @% E) A3 s1 m+ @( l3 o
% M; w. x0 R2 u" A+ x对于一般的文件,这样并不会产生什么麻烦。
6 h, \7 j0 T, j$ M5 L) c1 p8 `# P3 u6 b: X
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。) g6 d' B6 |+ `2 i6 W4 `3 h" b" m) t

# K# e9 N8 P' [- C根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
/ ]2 w: z- s3 H- D6 F) p- t
/ l* g0 ], Z( Q: O由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
8 R9 Z! t" Y) O% V3 `8 R+ O8 d" d) n6 W4 U. f5 G4 A
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
/ p5 p2 s* D8 s; I3 i. {, Z4 ^
- Y' k5 _6 G2 r+ h然而文件比较多,又想偷懒下,使用下列方法来实现。  . T- s$ ]7 n, w/ b6 N

  I2 b, j0 ]& _' I! x, |将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换: A7 `; [: L2 _( k% G
+ {, ~8 A% F: u# d

0 C% c" F/ |8 l5 y
  1. <?php , y; t' ^% S/ s8 s$ l& q9 m
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)4 b. i8 P0 \0 R
  3. $HOME = dirname(__FILE__);
    4 q4 t4 w; z5 W1 m/ R
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ; _4 }- c, n/ F& i2 h4 P0 Z/ b
  5. $WIN = 0;
    3 O" ]! G1 U# R: b1 L/ U. X$ }
  6. ?>
    % u/ M( N2 t) ?( ^9 s
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    " K0 S; \0 h/ A# {" d" R/ b
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ' C+ s' m+ u( i; a9 W# ^; c6 ^# Z
  9. <head>
      ~$ f- S* G7 v! r# w/ F' W
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, v2 B6 I/ D5 L2 I
  11. <title>UTF8 BOM 清除器</title>. B  ?6 v9 J. Z0 K
  12. <style>
    ) G3 d6 n# l# z
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    $ m. k) ~% _' D. Y7 ^0 y- U- E! @
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }5 \5 F( b7 m- w2 y- I9 v
  15. </style>. r0 ?0 y' P* {2 m7 m" J
  16. </head>
    . r3 n/ G& u  e0 }) z9 Y
  17. <body>5 E, X$ G+ ^6 g7 j6 ~  a' H2 a
  18. <?php& A4 v* \; }  |' ]7 U. `7 M
  19. $BOMBED = array();4 C" c+ }& I3 W' W
  20. RecursiveFolder($HOME);1 i0 ~& p7 d+ f) d1 o
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ; O* u" o, V7 Y0 m: A% r
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    3 ~- N- C, F$ Q& c* j7 A( p  x
  23. echo '</p>';" M( t8 J4 O% l0 P/ X" E3 r
  24. // 递归扫描5 j8 Y2 o  j( Q1 E# {0 \
  25. function RecursiveFolder($sHOME) {, j2 _8 p' W% X/ m5 d8 Z6 x
  26. global $BOMBED, $WIN;; s2 i* X) h; v7 n* j
  27. $win32 = ($WIN == 1) ? "\" : "/";
      q3 x$ r0 l8 X; A; p
  28. $folder = dir($sHOME);. l3 t5 B3 U8 a$ A* {) a2 ^1 N
  29. $foundfolders = array();% n9 L8 f. l1 m0 m) s: C, A
  30. while ($file = $folder->read()) {
    . h0 S6 Y6 r( u: w# a
  31.   if($file != "." and $file != "..") {
    & ^, R* p- p$ X9 }
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    : y- u7 l! y0 `
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ) q4 c, E/ m/ {5 h" L( e
  34.    } else {- G4 d: d% s# p" j' I% d
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    3 ?+ q1 a! E9 A, D
  36.     $BOM = SearchBOM($content);! n. y: [% h4 S+ B: \: |
  37.     if ($BOM) {5 P3 I; B5 U  _9 [5 z
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;5 \7 T% N: A* e% X% C, s/ F
  39.      // 移出BOM信息) e$ v/ _: o. @/ }8 X( T! c/ x: c
  40.      $content = substr($content,3);2 m% Q$ d# a2 I/ t- A2 H4 Z
  41.      // 写回到原始文件+ Y0 Q3 c8 }) J6 f
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    & a' N) `+ X. ]+ ], V/ A) L
  43.     }
    ' F; M& ~6 W& t* D6 \
  44.    }8 v; z( k! ~* ]: N
  45.   }
    " l) Q9 w8 d4 U7 n
  46. }% c* _/ h; M3 q5 e% S
  47. $folder->close();
    ) n" l3 `: |* d/ j, G$ ?; h' X. s
  48. if(count($foundfolders) > 0) {
    ; F$ C2 g7 Q2 D: t! }- V( V: c# K+ f& `
  49.   foreach ($foundfolders as $folder) {) t; k& B5 w! R: p9 F7 q: H4 c' d
  50.    RecursiveFolder($folder, $win32);+ t( S3 |) Q3 {; D
  51.   }# L1 K+ W! g3 W" f) t# c
  52. }
    1 S  k0 d( p/ O5 j) e
  53. }0 u, L) M/ C( h+ [1 ?/ S( h
  54. // 搜索当前文件是否有BOM
    3 x' w- S$ L& `4 j
  55. function SearchBOM($string) {   K3 h; w- W0 G" U) m8 m+ m, b4 s
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;" }' }- D3 Z3 N
  57.   return false; . P) f$ _' S9 n
  58. }
    4 v) }! _* H8 h: p+ }
  59. ?>7 F$ v3 f- {. V2 |4 g2 `: j
  60. </body>
    ) H! @* `5 Y- ^
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!: B2 S1 D3 e) y% B# [/ U* W

# x# {8 s0 Z, q4 z  e( Z: r/ k2 h

本帖子中包含更多资源

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

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.