开启左侧

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

  [复制链接]
67049 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
0 a' C& W8 o3 O5 x# a- R: W  ?3 J' R6 `
2 ?2 m* n' [9 A5 o这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。( W, q1 C- w# q. k- U0 L; X

8 P9 V# e9 y( X/ D, h9 R它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
8 p8 [; n. `4 x0 Z, y
% L, [, E. W" @" ?7 j; o, t对于一般的文件,这样并不会产生什么麻烦。
! p" j0 w; @$ u# s; c1 A# o
  K# c0 ^7 G8 ?但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
8 c! {( u; G+ k: j$ q: p
" S- z; B& x6 ]7 M' \: g! ?根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
6 D% e1 R1 ]; P4 c; e! v; ?/ U9 r$ t5 r
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!* t5 {$ i% I" o9 U7 h) B3 [; \) {

' Q, ?2 B6 n9 A' F直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ( `: k- `# {) P8 Y( b
9 |0 Q. J4 L% ?! M9 \
然而文件比较多,又想偷懒下,使用下列方法来实现。  1 l. Y+ O6 l& f1 x3 l/ A- e/ E. g
# m: L5 _- V1 c& F0 E* C
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换# c, P1 F" l2 p. D& S1 `2 L
5 S: C2 R( [6 P5 ?8 b/ h. m, ]
+ Q1 p) R' L$ Q
  1. <?php
    8 O9 O' V$ P: x* b
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)1 }/ S9 B4 h! g/ S5 k+ V# I$ r' [
  3. $HOME = dirname(__FILE__);7 l" H" q  M! W/ ~
  4. // 如果是Windows系统,修改为:$WIN = 1;
    8 h+ C+ z1 ]0 g0 H! u" `, Q
  5. $WIN = 0;
    1 [( y3 |0 V0 t0 V: M/ X) g
  6. ?>
    9 V2 C# r6 r5 P. A7 x
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    9 B0 c" {( ~1 `( C& v+ t
  8. <html xmlns="http://www.w3.org/1999/xhtml">  F! ?& U9 U1 M+ q
  9. <head>% a4 _  t) Q- r7 p9 P
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />$ D2 g3 b' W8 i8 A* _
  11. <title>UTF8 BOM 清除器</title>
    : X  T# k& B6 p, s8 P+ w
  12. <style>
    7 j6 Y+ _  o7 G0 M+ w2 m1 b
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }. a0 P$ ~, m5 ^+ X! U
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    / n' ^. L. n  L+ @4 z
  15. </style>; x1 ~) R6 X, o* c5 F8 v
  16. </head>7 h3 ~$ q5 ]0 M7 y$ S" l: p! M
  17. <body>
    6 `* X+ E; b+ u" J8 H" d) Z2 w
  18. <?php
    # C- e  J: v1 ~( Y9 c4 c7 O0 z2 ~
  19. $BOMBED = array();  Y0 ?$ L& H2 _9 \& ^) _/ P! O
  20. RecursiveFolder($HOME);
    % n5 Y7 a' s5 x0 c! H! T9 ~
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    - ^& d" o  W, N8 ^* J
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
      u  a8 X; s1 w3 T+ }3 ^
  23. echo '</p>';  m* z2 O; S5 }+ {) B0 ^
  24. // 递归扫描" @, t) X! O2 Q" A, v- ~
  25. function RecursiveFolder($sHOME) {: G! a) M0 q  O9 I" M
  26. global $BOMBED, $WIN;  t: h+ Y; x/ v$ o2 P$ w
  27. $win32 = ($WIN == 1) ? "\" : "/";( w$ j6 Z: K3 ^! x" e8 E
  28. $folder = dir($sHOME);
    $ N! f" z2 J' c. N/ w
  29. $foundfolders = array();
    6 }1 d' s$ u' d) I7 Z  ^
  30. while ($file = $folder->read()) {
    - ^7 \' M% x9 y+ Q6 d
  31.   if($file != "." and $file != "..") {8 W% l. w, F7 R6 z
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){# G, {5 q) h6 l7 D- V9 g" o$ U
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    3 m" h! ~1 J' B- R' \% A
  34.    } else {
    & ^6 Q1 ^# h* g5 ^
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    $ W9 w% \( g: X, {5 ]
  36.     $BOM = SearchBOM($content);3 h1 ]) ]* Z1 u! f
  37.     if ($BOM) {' j$ {' u& G! a5 g1 |5 a
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    $ P7 O& M( i& H6 c* `9 u9 R2 Z
  39.      // 移出BOM信息2 ?$ P9 M9 Z7 |  g. N
  40.      $content = substr($content,3);
    $ H# l( p- _+ D) c) r9 F& L0 o
  41.      // 写回到原始文件5 W; C- F8 H; p& S) E
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    2 a2 g$ l& L. C; l' r! x- w6 i
  43.     }
    1 Z# x& A( ?  r; P
  44.    }. ?) w" Z6 ^) R" l; C
  45.   }1 j+ Z$ _) B: z* f6 @0 S
  46. }% K  a, K/ _/ |4 V* l- t
  47. $folder->close();0 Q. a+ h4 I: f" E1 G
  48. if(count($foundfolders) > 0) {& ^  f/ L4 P& g# p/ z
  49.   foreach ($foundfolders as $folder) {
    ) l/ R( a- s# S3 J
  50.    RecursiveFolder($folder, $win32);9 O. E, I1 q" E! \
  51.   }$ O' Y6 p1 l% B" f. s; [
  52. }4 I4 V' N) I$ r' D: E  k
  53. }, d/ u) f$ N) F! N1 {/ k% t
  54. // 搜索当前文件是否有BOM
    ! v; z& _: t( U" ~
  55. function SearchBOM($string) { . @8 Q0 l7 d0 z* }! t: g
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    0 D2 r) J/ h8 K/ M9 j! a- u+ c; F
  57.   return false; & E( {" [2 |* Y9 A# \, Z
  58. }3 L% m# S0 ~1 A/ v# Z( @* j- O
  59. ?>* t' m$ e. `! I8 k: B& m+ r
  60. </body>
    3 j  X5 ]' \7 _6 @! l' y2 V4 c  Q
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!3 b& ^0 Z9 d2 t; Z* C! f

) d9 i$ u3 h" B, y# C* [2 C0 K

本帖子中包含更多资源

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

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.