开启左侧

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

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

3 o2 J, N" j* V5 y% K+ d8 e! x这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: y9 E0 I% @! A! e0 }0 w

, a! N) S! h& @: P8 Y+ v. u它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! r! C& ?5 c9 G6 ~) ~

  v/ U$ i, U5 d3 V: W1 q6 C8 }对于一般的文件,这样并不会产生什么麻烦。% t7 V6 q5 [) i/ k- @
. a- _8 w3 a6 ?: l: X8 C
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
% G$ C; ]! q1 l% u. Z3 Q( c/ W  ]
2 [1 j5 T4 G. u: F# m根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 A* f( f  R& q+ t6 @9 ]% b$ }

: C4 W) M7 |- b( P3 |由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
! p" m* x  y: W! [- @' j; C0 O0 q1 H
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ) t' p7 C; b* ^# A5 Z0 ?$ `$ P
$ O1 J/ H, K; M9 [3 f
然而文件比较多,又想偷懒下,使用下列方法来实现。  
% W- S9 y" Y' f+ @) Q/ h, o. b- j& ^/ \7 H5 O) ~7 H! P. W6 m
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换7 F% ]6 P/ c7 V( L3 A

7 D- \, x& N, @( B8 _/ W& b
4 X6 t5 h0 }8 x- R3 g( G
  1. <?php 5 E% j5 [& \5 `# O' o+ V& v/ ]; N
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)- f1 v6 m: s7 I
  3. $HOME = dirname(__FILE__);
    ' q, g/ @! u$ H, a
  4. // 如果是Windows系统,修改为:$WIN = 1;0 Y( @$ {6 g" S/ E9 O
  5. $WIN = 0;
    7 O5 d" J* N6 N$ o
  6. ?>) M: L1 \; |$ i. {
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    5 D1 P! F& p# X: P1 |; g6 o
  8. <html xmlns="http://www.w3.org/1999/xhtml">3 r7 k- H1 T" w. j* L0 {
  9. <head>
    8 i! Z$ \& J( B; }  {; u8 @
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    2 |3 N3 O( Q: X3 q* H  Y2 Y) }
  11. <title>UTF8 BOM 清除器</title>* J4 q+ W' P# ^! s. W
  12. <style>1 i" z3 _- v1 p3 e% `
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }; O0 g6 {& l; Y2 `/ r  a. i# n
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }4 [8 [0 P9 _/ n  v! D$ x* d( {; R
  15. </style>9 R. W/ ^: N0 h3 ^
  16. </head>
    " x7 X! g+ J0 ^/ {& k. I  w
  17. <body>; E# U3 l" C. H* L. A3 L! N
  18. <?php
      E) n# y2 b5 c3 ?2 E" l# u$ E7 j
  19. $BOMBED = array();
    5 ]/ R0 O0 a# T. f
  20. RecursiveFolder($HOME);
    7 k8 Z1 x% |5 ]+ y, I1 d7 N
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    $ Y$ I$ _# U5 V8 [/ R+ l
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    * s0 {' D2 ?; S8 _
  23. echo '</p>';+ s' p$ U8 k' O9 ]; P, z1 H. X
  24. // 递归扫描
    $ v6 V! C8 @" I3 B/ U
  25. function RecursiveFolder($sHOME) {
    $ p' A/ ]* \! S3 h7 ~+ c
  26. global $BOMBED, $WIN;6 W) k) [! [6 d# n) y0 C
  27. $win32 = ($WIN == 1) ? "\" : "/";
    6 c# ^1 A7 X4 ~$ A! e9 e
  28. $folder = dir($sHOME);$ R& E- Y2 M/ u. g9 C
  29. $foundfolders = array();  K& B, Q* R) B0 ~: h
  30. while ($file = $folder->read()) {
    . \! w$ b5 o$ d" W1 N3 ?" K
  31.   if($file != "." and $file != "..") {
    & I, G* w( k' T+ Q
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    , H8 R' V4 s) @  O! ]$ K
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    " I3 S* w9 @3 y- O/ i7 W) L2 }
  34.    } else {; `4 F6 W. f) d7 T
  35.     $content = file_get_contents($sHOME . $win32 . $file);2 L2 v2 o! H  F. {: x4 m
  36.     $BOM = SearchBOM($content);: k' u* X5 O# e# G; z- p
  37.     if ($BOM) {$ z; M- p2 I7 X
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;* [* k" P3 d6 Y. k
  39.      // 移出BOM信息7 `' @, A# |) E" T
  40.      $content = substr($content,3);
    6 O: n9 B8 V. Z+ P# H; }: V
  41.      // 写回到原始文件
    + {1 W5 H7 {: z, v8 x5 s5 A
  42.      file_put_contents($sHOME . $win32 . $file, $content);/ }- _8 O; r$ Z  u* K  h
  43.     }
    4 b% C# H) j2 U
  44.    }
    ( ^* f- [5 w" B3 G+ L6 W
  45.   }5 y6 _3 Q2 Q& u/ m
  46. }
    6 d- d" t5 a8 C" @+ o
  47. $folder->close();
    2 g1 x. n0 k5 R6 n$ M
  48. if(count($foundfolders) > 0) {7 f  ~) A2 g7 ^$ O8 ^' O, ^: c! ^
  49.   foreach ($foundfolders as $folder) {
    9 u; R0 Z# V7 n) _
  50.    RecursiveFolder($folder, $win32);
    $ O1 I& G4 @/ J, r& g: F$ K
  51.   }4 v, f- Z# t6 ^: p% I" v! D
  52. }, i6 q& o+ N- v% [6 S1 j
  53. }  w2 v: ~% {* k) G& p: @
  54. // 搜索当前文件是否有BOM
    5 N* x1 Y3 q0 N0 |: C' D' N
  55. function SearchBOM($string) { ; q% ~4 y/ ]# U& r/ x0 ~
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;, A% ]5 }4 d4 l  o
  57.   return false; % U; _  _- C, @& S& N: B9 W/ Y
  58. }
    ) N& k+ W, J8 F1 Z
  59. ?>( R, Z' M7 {, ]1 Q4 ?; T8 D
  60. </body>
    $ \2 d. {$ P+ ]
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
6 ]) w8 g  c3 ]" ]/ z
% }4 I8 H+ H) f/ e6 `

本帖子中包含更多资源

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

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.