开启左侧

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

  [复制链接]
66434 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  1 ~8 }( t/ g) S+ `( l- S! H
! C, o' d* S' e! @7 v
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。& d& W+ C$ b) ?+ i* k7 M. l1 F
9 j5 W- R4 ~  ]0 R6 r% I
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。1 l2 ?; |& Y2 e
$ |5 P0 M6 d6 c, E" c( y
对于一般的文件,这样并不会产生什么麻烦。
  R: \. p, x: Z8 A2 ?6 Y3 p' @  Y/ q$ \3 P
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。( i! w) u% [6 I; G

8 j1 }2 q( @) S$ X+ x  @根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。" s) O: \! y6 l0 \1 d  a4 d( _
( _! t6 s) l# ]! S& x
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!  {( F) ~, l: e! [* I# y
5 |" Q0 B3 h* ?5 a2 o4 ^
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ( ~! v" F5 @* V2 L* _) P
: P5 a' R% }/ V  ~
然而文件比较多,又想偷懒下,使用下列方法来实现。  
) _4 R$ d6 L' B6 A) @  |. L! n+ V1 e' ^
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" A* {; D: \& O/ E( [
8 T- X, Y. ~  R4 v4 p% O8 z/ U+ E4 Q3 v$ ]% v, F9 ^
  1. <?php " ]$ u3 i9 x: \/ V% y+ B
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)+ e9 `6 y. s1 @* h  m
  3. $HOME = dirname(__FILE__);9 ~$ `/ p' |" j1 F% h0 T/ A: ~
  4. // 如果是Windows系统,修改为:$WIN = 1;' L1 |5 n( ~" d1 w* R7 A  ]
  5. $WIN = 0;
    ) Q- w% P8 M* V; V3 u
  6. ?>
    7 w' e% q: u% K6 F
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    6 E5 z0 P2 S2 u2 y" n5 I& C
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    + ?  I. P& Y0 j: G7 K% `
  9. <head>
    $ q0 U5 z- i$ i, _
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      S5 y- w9 y, P8 I- s" b
  11. <title>UTF8 BOM 清除器</title>% |+ c  V- \! c% g4 P5 n
  12. <style>( e& t( Z9 \( }. s+ T0 w
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    & X0 D$ z- m; v6 E1 M
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }/ I8 \6 ]4 k' ?" B/ \, q
  15. </style>6 K  I2 w: w5 ^: a+ M
  16. </head>
    1 v; A; h, i0 X# i/ D
  17. <body>; y& q, I. Q3 B6 [
  18. <?php+ o7 M# G7 m) Z4 t
  19. $BOMBED = array();+ e, |1 O9 o4 a5 r
  20. RecursiveFolder($HOME);0 X/ v. B" o3 N5 Q* [! p1 C
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ; C' e/ F6 }- k5 V/ x" l5 r
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    & u) |1 R' Y1 q# ~/ [4 P
  23. echo '</p>';, N: ?& r# U$ H$ _9 A
  24. // 递归扫描
    ! c8 O5 B" M! y! G1 ^
  25. function RecursiveFolder($sHOME) {
    9 H2 z  q2 L$ ?4 ?0 S& w
  26. global $BOMBED, $WIN;/ I4 D  M: n, ]! |; [6 \
  27. $win32 = ($WIN == 1) ? "\" : "/";) m. z, `) Z7 v3 f8 o, T/ z
  28. $folder = dir($sHOME);
    2 A' d! [' Q6 b% e4 l8 Y4 i( q
  29. $foundfolders = array();( [7 f$ Z& K* O3 P
  30. while ($file = $folder->read()) {
    # B# v# B4 c: Y# ?+ y
  31.   if($file != "." and $file != "..") {
    $ K% u4 C' a- r+ v+ ~* N) U
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    5 O8 ?3 c- g1 }/ g- q) B% a
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    6 z4 s# n5 y  K0 ?. W
  34.    } else {) E% p) ^( O6 |. Y1 n
  35.     $content = file_get_contents($sHOME . $win32 . $file);- v3 J' W% w1 k
  36.     $BOM = SearchBOM($content);7 k: h4 b% z3 w. r9 Y* L
  37.     if ($BOM) {$ V8 E. }2 p* l/ i
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    ; J9 }- ~$ s4 j4 Z  j  ^
  39.      // 移出BOM信息6 M! K; j+ T; x% c5 c3 s, E$ v1 C
  40.      $content = substr($content,3);
    # y2 [9 j, w' e$ _6 j7 v
  41.      // 写回到原始文件
    - c- r4 s0 Y* _5 ]" A! Q1 X* K
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ' q4 z% F) G$ ?/ G& X; B5 h+ n
  43.     }' r2 ^) R2 R3 C
  44.    }
    5 s" b( s0 @7 u7 s. t  t
  45.   }5 b5 o+ f1 o) s6 W: j# m
  46. }' |6 h; ~, L+ s; J) w' x
  47. $folder->close();, A9 h% V, C: S5 ~5 S
  48. if(count($foundfolders) > 0) {# I; F1 h- S0 u1 w0 e8 k. g" l
  49.   foreach ($foundfolders as $folder) {
    1 e1 K4 R6 o" u/ U" [( L
  50.    RecursiveFolder($folder, $win32);
    6 h9 x2 ~0 ~9 M6 C3 N; o$ A& X
  51.   }
    , v$ Y8 _6 J4 k
  52. }
    6 z$ h' U% K: e5 ^9 `7 X
  53. }
    / ~1 T* S5 I7 n: n3 B0 q6 b
  54. // 搜索当前文件是否有BOM
    % a: g9 ]6 V' r8 n( \( k5 }
  55. function SearchBOM($string) { ( J7 D/ B6 R7 }
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;; z) T5 C* z% Q- h' b1 v; {
  57.   return false; / U7 d: O$ }0 [6 z3 b# A7 m
  58. }; ^; R& s4 ^$ l( f
  59. ?>
    9 F; a. p: c' I( ], f
  60. </body>! A* u  F! p+ A
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!0 |  s2 ?% N4 }. L( v& u
% n& h# I* O' H- c" 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.