开启左侧

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

  [复制链接]
62929 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  - @! A( J, o5 y% k
$ L' ~" S- ]# }6 N5 Q0 }9 W
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。2 s8 O6 _# Z. L, i

: X: Z: y) v  y1 @% ?它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。2 g% I8 _) ~$ H$ i9 d+ y% X) p' b4 Q
) ?+ g' g2 U- z  F( t) R9 G# z) ~
对于一般的文件,这样并不会产生什么麻烦。
' R' V6 |8 F" l; A5 ^) j+ O2 i2 Y! ?: _  J
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。/ g# K  T+ G1 W7 e
3 b4 r' {. w  i
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
: i: S, j3 H! e6 ~6 Z) b
' t" Q! a8 M; G& [1 ]8 Z由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!; l) a  c3 u+ P4 o6 \, r9 a2 a" s; C

5 D+ Y$ e8 E4 P" D, D* O直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   / D1 x" L$ X( O' p

0 K- L6 y5 ~7 W然而文件比较多,又想偷懒下,使用下列方法来实现。  0 h- B5 B, P; t& V

* f; e! B4 v7 w; F3 l0 z8 g2 f/ J将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
& x$ r3 j4 ^) k6 C6 o( G; e0 X6 j' U- g% F' \6 V

2 i7 D" K' N! f% s) Y7 |- i& O
  1. <?php 7 |1 p- N& t  t! r
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    # z+ Y# e9 I! Q( l# ]) w8 T
  3. $HOME = dirname(__FILE__);
    2 n8 J' N; a6 I4 E" o$ E# U% |- A
  4. // 如果是Windows系统,修改为:$WIN = 1;
    1 S) N( Y# c  i, W
  5. $WIN = 0;$ E% w/ ~& _* u5 N0 |
  6. ?>
    8 r' v; O- U; C2 q& @, Q6 M( s1 d
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">3 x, F8 s7 t9 c- v! v
  8. <html xmlns="http://www.w3.org/1999/xhtml">+ C. J7 [' e5 a8 K$ N3 E7 Y
  9. <head>
    0 p2 j5 H9 R2 [0 M4 P/ ^( M0 A, [7 `
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ! }- R8 ]: X0 e
  11. <title>UTF8 BOM 清除器</title>. `' f, q* Q% X$ s0 V" M' }0 @* ]
  12. <style>
    6 h" }2 N. c+ N; I( W
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    2 e+ E' j9 s+ X4 k
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }1 m2 _7 U) {3 H+ J0 G) s; @
  15. </style>
    * s; y" c) I) s- l! k
  16. </head>+ O7 L0 e+ X% o2 l0 Y
  17. <body>
    ! m8 u" n, H/ B$ F1 F
  18. <?php
    2 E. X. ~! ~5 m. ^* c0 R
  19. $BOMBED = array();
    6 B" L. {- Q' J4 A8 v
  20. RecursiveFolder($HOME);
    : b; t4 T! Y9 c# Z; w
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';& I9 D# v$ Z. ^# s/ Q! o
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    8 S$ j* k2 L% r0 E/ _  K- w
  23. echo '</p>';) \* b* t0 z' A
  24. // 递归扫描: T  b8 g4 r( F- h/ Y
  25. function RecursiveFolder($sHOME) {) h8 a; p$ k) u7 p5 M" Y
  26. global $BOMBED, $WIN;
    / i0 Y% h0 H0 U& O9 f
  27. $win32 = ($WIN == 1) ? "\" : "/";  I6 D* `2 P# D
  28. $folder = dir($sHOME);; @+ |9 X- p' _( p9 Z1 n) u# N
  29. $foundfolders = array();! ]+ J4 r* k3 t1 ]0 ^' e! @
  30. while ($file = $folder->read()) {
    ! U- `% ?% t$ g5 C
  31.   if($file != "." and $file != "..") {
    7 @$ W& @0 S8 a" E  O
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){3 `0 a9 Z: E  F; J
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    $ d) F6 V$ F2 z! G( e
  34.    } else {+ n6 d$ t2 y5 v/ ^( t" s6 R  V
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ' o0 Z+ w7 e/ u0 p& ?6 K9 n
  36.     $BOM = SearchBOM($content);
    9 j6 I% L; H0 H1 z1 ^$ v
  37.     if ($BOM) {3 h% M% [6 V9 Z8 N& o
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
      I" {7 e! D  k
  39.      // 移出BOM信息; s0 q% G; d+ X3 M  [3 j# x* p, L) Q
  40.      $content = substr($content,3);# e4 S, N; b9 Q' o7 R* a
  41.      // 写回到原始文件
    " K1 D) Y/ N; y! @$ y
  42.      file_put_contents($sHOME . $win32 . $file, $content);- h5 R2 x4 W/ ~- D/ w( |- Z
  43.     }2 g1 d8 w' k0 y' ^
  44.    }
    7 f. m: `) w9 d+ f. l( Y. x0 B
  45.   }
    ! z! L# \% d& i6 |
  46. }
    + G2 Q4 J* J. P
  47. $folder->close();
    " C; t0 q/ V0 J& H* h! B+ n( M. H  b
  48. if(count($foundfolders) > 0) {8 t. U/ l( S4 b3 G
  49.   foreach ($foundfolders as $folder) {
    ' S) k" B2 J" W8 i5 @. m0 D4 v
  50.    RecursiveFolder($folder, $win32);! y5 i/ E! I# H8 N* x
  51.   }
    ! S( }- ~) k  k' W8 B) K  K) T8 c9 e& }
  52. }
    $ G5 k3 b) }. V% I0 @1 B9 w
  53. }5 g: N& E$ c8 _) E7 y
  54. // 搜索当前文件是否有BOM
    : ?: ]1 d6 }/ q( p/ r+ C
  55. function SearchBOM($string) {
    0 h; C+ J) p" t/ }
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    # U0 d# }0 F, R& ^
  57.   return false;
    2 s4 ]: f1 U5 i* a9 B
  58. }
    * E. R3 G" A/ |2 h) ?# _7 z4 Y
  59. ?>" E8 N# v5 x6 l: H) D  c
  60. </body>
    " T4 z+ |6 }' a
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
7 i2 \9 C& u6 h; Y- I( R+ l9 m8 V" x: j

本帖子中包含更多资源

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

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.