开启左侧

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

  [复制链接]
58997 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  / z. B/ r; ?. @5 O& R+ l

) _: p3 v3 u$ X这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。8 m  x( U( |) H
, V; e# g3 R* z5 [6 v
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
+ b5 \7 ?! @4 o' a6 E" ?/ `2 \+ {2 }+ ^* B) r& o' {
对于一般的文件,这样并不会产生什么麻烦。; H/ y) ^, M% F; H

- {0 {; H3 S% v5 J6 o6 w5 }但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。. ?9 O+ w/ l3 t$ M' M3 S* v& B
- l- Z  C8 X6 D# s# w5 O+ m
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
+ }! t# x5 F- I: s/ a2 J9 A
6 j! A* B4 x. \! Q& {- n) G由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
9 x. }6 F) m: a% O! V
9 m+ e& a# ]* \, n  [直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
5 g" r* P0 t! k& U) J, E9 c3 V1 J: ]1 o4 m! c7 T7 e1 T6 ?
然而文件比较多,又想偷懒下,使用下列方法来实现。  : D, G$ P9 j* @8 C
/ `+ r- h( c/ S8 ?2 F1 y/ R
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
% W3 s0 N# K! }* T: a; a
, Z9 h% v% A8 I
+ j3 U: {& F% W1 l2 ]$ r
  1. <?php
    0 @* Z  d2 i' ^7 q. Z
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    ' W* y3 Q- {) h9 R3 @8 M
  3. $HOME = dirname(__FILE__);2 D3 R! s2 W6 r) @4 S; K
  4. // 如果是Windows系统,修改为:$WIN = 1;6 D3 D9 J8 Z" M* L; k" M8 ]% w
  5. $WIN = 0;5 W  i! y7 E2 D. T
  6. ?>! W1 l* a0 ]. @0 v. k
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">- M' E0 G! D" [
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    , r) B, f6 F" E2 C9 K& P9 Y! h4 _
  9. <head>
    ( b  L7 U5 e8 t% m! z
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      M+ w5 w) t; y$ w& \# Q; b* Z
  11. <title>UTF8 BOM 清除器</title>0 V* n! d# W! R# w3 D. K$ q
  12. <style>
    0 x. |9 T+ f1 s+ P$ O' y
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }+ H2 P4 X1 l4 @( Q9 p+ N; |
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    - c) `1 \  ]  z, v; F8 p
  15. </style>" y5 b' S  P+ P- x5 Q
  16. </head>
    . |; O4 g# ?6 i: d' E
  17. <body>  b6 o+ m3 l5 d6 H) B7 B
  18. <?php: W! A7 s: {! B3 {) ~
  19. $BOMBED = array();6 A4 d* }8 Y1 G/ ^1 G
  20. RecursiveFolder($HOME);% D6 Z% l( j. G4 d
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ( }8 |& v  ~, W1 ]- P" I8 A1 f( p. w
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 G# F& @/ W' G: G' l' i
  23. echo '</p>';  S* }7 L0 _- V: E, _
  24. // 递归扫描# }6 c& a6 S; Z* S
  25. function RecursiveFolder($sHOME) {
    : z4 H. R- f' A  F  p
  26. global $BOMBED, $WIN;
    ; F5 c! K4 u) C' r
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ; Y0 l/ Z2 l; q
  28. $folder = dir($sHOME);- Z- i# U/ Y. W  P- l
  29. $foundfolders = array();3 ?/ p, C3 [5 ^& m: y$ X7 L7 `
  30. while ($file = $folder->read()) {
    ; P- F8 |6 a# @5 i
  31.   if($file != "." and $file != "..") {& \/ D( ~8 e, W5 C7 G
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    / A) I& i% ^2 S
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    3 Z  }2 K( l0 n9 H
  34.    } else {
    9 }+ z1 \/ P8 i- ^8 r, X
  35.     $content = file_get_contents($sHOME . $win32 . $file);: F# V( A7 d8 f, Z
  36.     $BOM = SearchBOM($content);
      v0 e0 b; e% z5 D: A, @2 ]- E+ M2 u/ X
  37.     if ($BOM) {- h) z& l3 A6 T$ `
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    2 b; I7 V' W5 l" U5 [, Z6 [7 w, z
  39.      // 移出BOM信息% S7 o! g1 C4 V% A8 V( k
  40.      $content = substr($content,3);
    4 v& P% w% u. b  _; n
  41.      // 写回到原始文件& ^3 \, i& B* G6 u+ p  x8 w
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    / ^7 T& q6 d  j5 c& m
  43.     }& n% |' n7 b& x7 n, e
  44.    }' J- B. ~  i6 R+ x# O, B
  45.   }
    / \# _$ g: |( @. g6 Y) \
  46. }- f1 x1 X3 a# Y8 J7 i% s3 X
  47. $folder->close();
    : C: B8 D) ?5 n) Z3 B
  48. if(count($foundfolders) > 0) {
    5 H$ X) q; [. U9 p9 {
  49.   foreach ($foundfolders as $folder) {  ?" W- J% O: a" w4 M6 k
  50.    RecursiveFolder($folder, $win32);
    / ]7 W9 @. z/ ^7 L4 O9 i
  51.   }6 K% F( M/ q+ {; [+ f6 p4 W
  52. }- |, Z6 m% @, I. |/ T! r  a
  53. }
    5 U* m. v3 ]" y* F' V/ t
  54. // 搜索当前文件是否有BOM
    4 K7 ~- I- o/ W4 D
  55. function SearchBOM($string) {
    ! k, K3 {9 V$ c  `) O: ?$ @
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;$ y6 M5 c6 Z& }1 b3 W
  57.   return false;   p1 _3 R* r* |5 M) Y
  58. }
    , I3 N) @- k- N3 O) `& X
  59. ?>. z3 [$ w. w1 I# T" r# v4 t
  60. </body>
    % w9 ^  w9 M7 s
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 ~, E' k, Z% B, g) S

( K( {' q* ^* L8 z0 M; Y2 q" ^5 j: v9 O

本帖子中包含更多资源

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

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.