开启左侧

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

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

. c  |7 C/ k, C% _) ]这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。" x9 e9 {8 t: a7 e1 E! t

  L! h  \+ o3 [+ U它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。; D* M' H- s3 \4 B
, r# n$ g/ V( M, S. h8 h
对于一般的文件,这样并不会产生什么麻烦。
5 B; Z  m' k; ?) ~% ?' l6 m4 c& w/ H! ~$ Q- W& m  o' b9 y% y) i  z7 Y7 u1 G5 L
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
9 \* J/ |  M! ]9 c3 O/ ]7 {( `- R# U) j
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
! s6 \) B+ j: e) R4 X: D! t9 @: H4 z' @1 p. |& G
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
8 R7 P; w$ e- @# Z
; [% s! N& s0 }  |8 ?& k直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   9 F$ k  H% d2 w4 M2 A: w
4 h5 ^% E5 E; D/ Q% v
然而文件比较多,又想偷懒下,使用下列方法来实现。  5 ~0 |2 X# K# D5 c

9 N- E4 v9 m$ _, F; a将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
7 _; j% a4 x' t$ p4 q% O4 d
) a6 a1 ?! z" r, e+ K& C7 A: s, C1 q- ?  E. R$ v, _7 V
  1. <?php
    4 a$ l/ ^7 v9 O  a, J  e
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    ' `* ]6 y1 A: K* H( p. d) \
  3. $HOME = dirname(__FILE__);
    2 C& {$ l- F* `& L# N- M' B0 O
  4. // 如果是Windows系统,修改为:$WIN = 1;
    / J/ S5 x2 x8 O1 l
  5. $WIN = 0;
    9 ]" w! ^! L& I9 _$ F
  6. ?>, D+ ^8 x3 [3 ?7 T3 i& o
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    / d* I& W6 _. I  Q
  8. <html xmlns="http://www.w3.org/1999/xhtml">; w; M7 Y4 @$ t1 Y6 u2 d
  9. <head>
    $ M1 l  }. e8 A+ F" Q3 |) G% H
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' d* n- k  ?' W% @- h4 W
  11. <title>UTF8 BOM 清除器</title>
    0 f) t1 X1 f7 [
  12. <style>3 k7 N0 e# w5 S
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ! }( t5 r6 b. {9 ^7 D0 D. [$ Z& v
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }- i1 _" z7 H" m$ X1 q
  15. </style>
    0 V( I) B; L$ p3 T- C$ ~3 K. p
  16. </head>: C* Y" O( k, A" `+ c; h
  17. <body>, s- ]. K. p! `+ @  K9 `+ r- S2 p
  18. <?php
    ( y9 S0 Y! [1 V9 }/ i6 j1 O' h% N# H# X
  19. $BOMBED = array();
    7 Q4 J; \3 H+ R3 F, ~
  20. RecursiveFolder($HOME);$ ?1 b3 \9 {0 @/ j  ~! ^( e, W' M  G
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';+ V- X/ |, ^. P4 M
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 K6 A3 N0 f4 g; \# u9 `* \7 p
  23. echo '</p>';! u$ `% L6 m; M. d% m
  24. // 递归扫描& e1 [  Q5 }% }5 q% y7 U
  25. function RecursiveFolder($sHOME) {
    ; i  Y/ s5 W% z
  26. global $BOMBED, $WIN;
    , ?6 f8 u( H! ^) z' {' e
  27. $win32 = ($WIN == 1) ? "\" : "/";$ p, A( m0 o) w( d, j# I  ~- R
  28. $folder = dir($sHOME);1 E5 B( G7 n1 b1 v9 ?8 |7 w1 x, W  _
  29. $foundfolders = array();
    - ]3 K' ]  |2 x! p, F
  30. while ($file = $folder->read()) {
    ; S! m6 b8 U8 f/ f( W- F2 M7 y
  31.   if($file != "." and $file != "..") {
    $ _6 `/ z6 S( E
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){* [# p" d8 X* Z
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    : s; D. x) Q3 C5 ~4 m7 |6 p- R+ c
  34.    } else {* D6 l- e& h& Z8 G- N
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    4 S8 K0 [4 e" n" E& v  P: |# O
  36.     $BOM = SearchBOM($content);! @+ ?0 ~7 u: ^9 c1 G
  37.     if ($BOM) {
    # f( I" M% i/ [. {+ `3 Z
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;2 s' M6 J' n/ t' E3 _, e, L; i
  39.      // 移出BOM信息
    : b/ l! V& X- u$ }, H. c
  40.      $content = substr($content,3);) D" E: w0 R1 J, v
  41.      // 写回到原始文件
    2 I7 u  J: D5 l+ l  W! y: [( A) R
  42.      file_put_contents($sHOME . $win32 . $file, $content);' I7 ]  T( L1 x" P& r7 \9 g8 [
  43.     }8 t2 F& f4 ^; L  V
  44.    }
    ! r' n2 }' t& W: c1 G
  45.   }$ h% i8 |. n  I6 G
  46. }
    % e2 Z2 M; Q2 t2 T
  47. $folder->close();
    ( g" u0 O; Y' n/ ^+ Z+ |$ k
  48. if(count($foundfolders) > 0) {
    ( z5 b* {: b* I0 v1 s7 W
  49.   foreach ($foundfolders as $folder) {" V; W( H# P4 P1 E3 M- ^
  50.    RecursiveFolder($folder, $win32);
    # {! ~9 e" ^0 _( l1 m9 F. f( h
  51.   }. i8 u7 \& S& t: w
  52. }
    . g# o3 N7 C) S& z
  53. }
    5 S; N0 L6 j* ^9 S# e) x5 t- R3 P
  54. // 搜索当前文件是否有BOM: g. W' Z8 o. r7 a% \+ i
  55. function SearchBOM($string) {
    ( [- d, N/ r8 _% s
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    5 y2 i# m% P1 ~' d. u/ z
  57.   return false; + N" e/ K7 L+ F# U( u7 k# A* f7 g  h
  58. }
    ' ?1 a( _% }' j
  59. ?>
    * C+ ?( Z" Z: B+ Y$ M
  60. </body>
    7 J9 ?( `3 {% K9 ]. G7 R( R
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
$ A( B" }0 z% n& H8 {
+ B9 `4 {1 A; ^7 T0 V: v2 l

本帖子中包含更多资源

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

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.