开启左侧

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

  [复制链接]
66094 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
& |% i, P) U% G
7 @4 k- Z# r+ o8 `; |) q2 K9 l这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。0 ?- S: |* n+ j5 ^! p& q9 I0 J( Z
: M6 X/ a! H. F  E, O0 ^" ~' G, x3 S
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。6 W) u# i' s) o- l( ^, Z

+ R* r8 u1 Q; A5 ?" Z) G# v对于一般的文件,这样并不会产生什么麻烦。7 t4 x( n$ J, x7 j. o1 U1 l
. Q* k/ s1 C' @) H
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
' w" K9 j+ e+ i. C
' f% S1 f/ h3 o根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。, e7 ?/ y6 H3 E' N

* }# d9 g* e- y: ~, S由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!0 m0 q- |0 U! _- |7 d
3 l) v& z/ G: S! X* h: |
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ' O: a* ~, i3 z  x
' l$ M! W' j) ~6 |: }4 p7 t7 ~) G. z
然而文件比较多,又想偷懒下,使用下列方法来实现。  
; ]: s5 z, E9 E2 T6 |) A8 }' Z* B2 u% u- b# Y* O6 b4 F
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
0 [5 ]$ ?. ]# W
2 K4 T4 X( `% H3 y0 V! [, m4 b) ^4 A
  1. <?php : Y! k, X# q" @
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)- k- o8 j! M8 z- U2 x, Z6 M
  3. $HOME = dirname(__FILE__);* J1 S( l6 X3 ?0 J
  4. // 如果是Windows系统,修改为:$WIN = 1;; b3 @) ~5 c8 K6 [8 m
  5. $WIN = 0;
    / V; L5 ~3 a+ ~5 w( y+ E$ L8 w
  6. ?>& g+ B9 H; k& Z$ m- @/ y4 s
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    $ h* J" n5 Z8 f' Y* f& O' ^0 K! I8 [
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    8 N1 U! i1 |7 d/ e# y* X# S) M9 ?
  9. <head>
    % B# c5 q/ W1 H
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    & @" [: m2 T/ g4 ^
  11. <title>UTF8 BOM 清除器</title>
    % G% z' i/ [; r4 E7 ~. u
  12. <style># m1 c1 Q' _/ |+ r, |* |8 @# T
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    . X* Z7 y; f- l) `# U
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ) Y4 X% m# e& u
  15. </style>
    7 l. k& R) b$ F0 D& C$ q
  16. </head>  Q$ @! \! j4 Z: b7 a1 q8 u
  17. <body>
    ) o4 m; Z- B' B/ e1 z0 L* N
  18. <?php! N, o* G# D8 m- i  A! |. J
  19. $BOMBED = array();
    2 |& r- L; [, F* u/ l* y# P, q
  20. RecursiveFolder($HOME);! X% H4 p/ ^; u) [
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ; L$ t, p$ G; g4 q5 @8 C# e" U
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 `0 {# H, V. b; o  S2 f8 z
  23. echo '</p>';6 k0 ^+ h. [' l$ f0 ^1 n+ e
  24. // 递归扫描6 A. B9 M3 V3 v: S! r' m; l1 b
  25. function RecursiveFolder($sHOME) {
    1 V0 K/ f( f3 C0 G8 D4 u
  26. global $BOMBED, $WIN;' ?3 E* m: z/ m, M, T
  27. $win32 = ($WIN == 1) ? "\" : "/";
    * q( O4 w+ O7 V4 v
  28. $folder = dir($sHOME);
    ( J3 b8 T! u( h! z! I
  29. $foundfolders = array();( W" J4 r1 j0 a. V! U
  30. while ($file = $folder->read()) {* L* z" K5 K! j, n2 `
  31.   if($file != "." and $file != "..") {
    " J( y  Z" `  v& x# O- g5 `
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    ) j9 [$ k9 V, M3 z6 S3 A& p
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    0 @, ]4 G0 ?' T
  34.    } else {
    . P% k0 W& W! H5 k, @2 m5 u
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    / P/ H  x6 ~' ~2 e
  36.     $BOM = SearchBOM($content);, |+ p: C, p+ q' X, G1 S9 I
  37.     if ($BOM) {# K/ l8 G5 W$ b6 c
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;+ g$ p  n5 _# Y5 l
  39.      // 移出BOM信息
    $ z* _. A! o0 [& ]
  40.      $content = substr($content,3);
    0 e* @9 ~- w+ x5 P, ^
  41.      // 写回到原始文件5 N/ i4 _9 A0 d$ J0 V
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    + {4 C0 P# w1 j* F$ J/ n- a2 r& c
  43.     }
    # U3 l$ j& a" U0 S; `- w
  44.    }/ s9 p  Y! B+ Y1 D% z  Y
  45.   }  `; p1 n$ n9 C2 k
  46. }* d2 G8 j+ }8 M( W  G
  47. $folder->close();
    8 r1 b3 |/ f& y' T% X; t2 V
  48. if(count($foundfolders) > 0) {
    ! ?& p& s+ @( j0 H
  49.   foreach ($foundfolders as $folder) {6 Y3 T5 y5 ^% z& I" t
  50.    RecursiveFolder($folder, $win32);- L: t( x. G; I
  51.   }
    0 q* W. Y- |4 U- P
  52. }& }2 _; i8 d" p5 q1 w. f  M
  53. }
    ) \7 E! k- E- N$ \
  54. // 搜索当前文件是否有BOM2 K, w# i$ z+ w) I5 r7 i0 Q
  55. function SearchBOM($string) {
    1 \) l4 S) i' f) x! A
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    8 p9 I5 F# e1 J. u# T  g0 t/ V$ f
  57.   return false;
    ' S1 Y: u/ m' V$ y* V
  58. }/ p% ]- z! S. w; G9 l/ s3 b
  59. ?>9 g# @) |, w3 |; ^' X# ^
  60. </body>( r4 E- s3 |: ?) x' @+ h) Z7 M) }: J
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!6 x: I5 x3 Y/ Q2 @) F- b: Z

5 R! w# g9 `; g5 b+ b6 ~' ~4 \: s" r

本帖子中包含更多资源

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

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.