开启左侧

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

  [复制链接]
61390 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
, G9 D8 a; h4 B3 j$ \* U
9 G, X# V3 I# Z这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
* u8 d, Q+ `& d3 ~/ ?& \( R
) S; G/ R& f$ f1 Z它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
) K( H+ V' G4 x8 Y2 g
0 z- U, f3 l/ O+ u对于一般的文件,这样并不会产生什么麻烦。
( K/ P8 q/ a/ g0 V3 h
; _( z1 I* y) h6 v, P8 B: H但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
3 W# D/ ~& a% ]: s3 F( k- w2 s. y4 j) Y' v
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
9 q3 Q: K+ S% A) M
& ^1 J; S0 U0 M1 f/ ~由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!0 C2 B( ~5 Q8 s5 b

( o3 \* R; p8 a6 B$ k, b# S4 N: m" M直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   + J  e& Y4 s- h. W+ a) g8 ]3 k

- v' X6 s$ \. a然而文件比较多,又想偷懒下,使用下列方法来实现。  
8 }! q/ G7 n9 n
' H' s+ H) n# s7 [将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换+ ^8 F% A: I( d$ c- |+ ]1 d% ~

0 p: x) r, @& x' _0 h) k3 L" i) M! ^: a8 t3 l, u$ v5 ~- Q
  1. <?php
    * I" w* o. |: a  u* F; d
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)$ r1 a  R3 \( d8 y* k
  3. $HOME = dirname(__FILE__);
      O9 I$ D, x0 R: K
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ; ?  Y* W& Y7 L2 {
  5. $WIN = 0;$ ^8 U" M1 t3 m  H6 A! |& N
  6. ?>
    ' @2 l* N1 r2 D- T+ T3 Q* Q
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    6 R; c# a- H% p+ l8 x& |
  8. <html xmlns="http://www.w3.org/1999/xhtml">, d/ o4 z+ T8 d8 ?# h
  9. <head>$ F( _9 L# w  t# |
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    : y! L0 S1 z& J! F& Y
  11. <title>UTF8 BOM 清除器</title>
    & j# e+ |, w. S# X* l6 `
  12. <style>
    7 i9 y' P/ g& Z$ }: s; e+ }
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }/ P; j8 I/ M# V( @9 A/ P
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    : J2 X4 x( s& P7 Q$ b
  15. </style>) P. C% S/ ^. L& N
  16. </head>9 {9 e3 w& i% D
  17. <body>5 @+ d. p: X' ~( b
  18. <?php
    - j6 X& Y2 X. E) Z: n; W" \
  19. $BOMBED = array();
    3 j% F$ M- O5 D8 O3 J4 u
  20. RecursiveFolder($HOME);6 p, ~( g& P4 o  K6 D5 \& D
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    7 `. w7 J0 ?/ Q, S0 k! s' p# z
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ) C& e$ u5 F) \0 h. r, i
  23. echo '</p>';
    1 I0 f6 J/ d" \) g+ v6 H
  24. // 递归扫描
    ) c- C7 s3 k# d$ O2 L0 N% j9 @
  25. function RecursiveFolder($sHOME) {
    - ^5 X* n1 w& d5 U( H+ P* Y) [, A
  26. global $BOMBED, $WIN;5 L6 |' H+ x& v8 u5 i
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ) N9 E( i  c$ @
  28. $folder = dir($sHOME);+ J$ U! W. e$ i. b; q7 B
  29. $foundfolders = array();: Y' U3 _8 h8 n) ~
  30. while ($file = $folder->read()) {
    ; m. m  E. s  A/ e5 M
  31.   if($file != "." and $file != "..") {& _# O4 H) N1 j
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){  c" \  f2 O2 j) v0 Y
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;2 M0 E: H* Q7 L% J7 @, }) k/ Y5 X7 u
  34.    } else {% R7 v9 S! @& e
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    & q- y" d7 [5 A- d' M4 v
  36.     $BOM = SearchBOM($content);
    ; O. _# i. @/ _, s! s3 {
  37.     if ($BOM) {+ Q+ S+ g' G9 ]5 E
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;, g' j! _& E) B4 p
  39.      // 移出BOM信息" l2 B$ }) _4 a; T$ u% z2 C
  40.      $content = substr($content,3);" W- X- p: ^7 m7 }- H5 _9 o% t
  41.      // 写回到原始文件
    5 k+ @' U. H: V  P" _* r" ]
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    0 G$ X# Z# y+ z# l, x( h: f% ^
  43.     }
    # L/ t3 F$ [3 n1 C/ Q$ Q) |( {
  44.    }
    ) t: }: l" l" h$ ~* ?2 X7 i
  45.   }
    % }) W/ I3 s1 y; p. Y/ a
  46. }
    + O- ]# ?* i; S! {
  47. $folder->close();
    , m; m% A& ]! L3 R8 @! J2 X& ]
  48. if(count($foundfolders) > 0) {3 ]5 ~" Y: _: H. q
  49.   foreach ($foundfolders as $folder) {5 e1 W  b; u9 Q9 U* g$ f8 M; Z- L# X
  50.    RecursiveFolder($folder, $win32);! a5 X: b9 b, y6 \* o% ?
  51.   }
    2 B2 e/ u5 W, n, V! K" s
  52. }. m6 ^  W! g7 R2 Q: d/ v  R# ?. L
  53. }, }( f2 r; C5 G' W! U& c! [
  54. // 搜索当前文件是否有BOM
    # e% p3 ^, ]$ m$ T# T  U5 {
  55. function SearchBOM($string) { 2 k' m, _; t- `1 f- `
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;5 z  U! E+ A0 k; ^1 C# M' r& {2 ~
  57.   return false; ) U% f; y1 x8 c9 I3 I: u) _
  58. }
    + o' P) O- ~; W, u: h
  59. ?>
    + n* S0 z" ^) X) V
  60. </body>
    2 ~  t: p7 K4 J
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!& i/ {3 _2 f+ F; J" U# A
* M3 t7 B+ J3 h# h: G

本帖子中包含更多资源

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

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.