开启左侧

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

  [复制链接]
65803 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。    a4 h4 k/ v" W
* N9 C3 S( x, h% N/ ~
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。& v6 q- n! z6 B1 C* \6 z/ k: {" W
1 V& h7 H! f$ F5 M6 H
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。9 S7 U0 ^  u* d& P- D" \- C
( W0 F0 P% u9 L/ k3 ^
对于一般的文件,这样并不会产生什么麻烦。: h/ H$ c2 p4 \2 X+ P6 Y7 v6 S
6 D! s" d8 ], b9 ~
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
. e, y% h4 E/ b! B, \7 ]; N7 a6 f5 b3 \: P# V! z# p# b% ^3 O. u) _
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。# t9 h1 U  k" `7 d+ |( i
8 p+ z; [, d9 D/ L$ u
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!5 m, F: v' E! H6 j% x

' N' k" L! g" {5 ~& \" s, S直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   : k* w, S- J5 ^* r; |
  d) u! a2 v8 k$ i
然而文件比较多,又想偷懒下,使用下列方法来实现。  
, Q( d, v# j5 T4 J" j2 z; W$ E. C% o2 N) v& L1 B
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换# U; z4 s% X8 M3 g: C
/ A/ r7 {5 Z# _
' j: \: M. V4 |( U
  1. <?php
    4 i8 l. [& I* V4 C6 z/ _" C# F! F
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    4 r4 t7 L! z( w: r5 \* y
  3. $HOME = dirname(__FILE__);
    1 ]2 y/ f/ h  f: c; m" r0 c
  4. // 如果是Windows系统,修改为:$WIN = 1;
    * _- z3 j8 d  r# [6 Z% g
  5. $WIN = 0;" j; \. I" z) T! W: g
  6. ?>: t) `7 E" _9 G% ?
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+ ~& E* v: V) ]( J3 d5 e
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ; b" Q% u. h* P. F6 i$ |- v
  9. <head>
    8 O4 l/ v3 P9 R9 Z
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /># |8 e4 E  p9 t5 |" T
  11. <title>UTF8 BOM 清除器</title>8 }1 O& z+ q: i3 U9 A
  12. <style>
    # K0 _! b0 L% }; K$ b
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }5 X+ Y3 F2 l0 D1 f4 e" O$ e
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }5 p( H9 d8 `; m! k# a* B
  15. </style>
    * t7 p- @9 Y* q6 }% Y! R, A
  16. </head>
    5 [3 N5 M$ K9 N% |# _" v  q6 p
  17. <body>  T: D8 g+ B4 j) X; P
  18. <?php
    ; J9 U  l+ ^% i4 C: d
  19. $BOMBED = array();
    9 O8 `+ w: j9 `) A0 X
  20. RecursiveFolder($HOME);# j" J& n8 X) a# y6 f
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';$ b: D2 h, I: a- E
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    7 ^" Q. A0 X& M) q' G9 v0 I. E7 L
  23. echo '</p>';! n' c6 R9 @8 V% a5 e* C4 F
  24. // 递归扫描7 f# }& `* }/ _0 e' f* J
  25. function RecursiveFolder($sHOME) {
    1 ]1 G; \1 w4 X$ e6 g
  26. global $BOMBED, $WIN;: V& T- G0 D% S6 a: w
  27. $win32 = ($WIN == 1) ? "\" : "/";
    0 D% S3 Q0 M* S7 o9 Y% E
  28. $folder = dir($sHOME);9 c+ L; b5 P! y3 R+ @, G! f7 b
  29. $foundfolders = array();! o  _7 b3 Y1 v+ z" V! v9 P
  30. while ($file = $folder->read()) {
    4 e+ H+ [- n! g- Y) J/ _
  31.   if($file != "." and $file != "..") {
    2 I, j. ?9 s: k+ V0 b
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    $ n# G# ]) y0 ]
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;: z, W2 N8 U4 @
  34.    } else {
    4 O; @* f/ h/ }3 |+ [
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    : B; e- c% f1 I8 V, O4 d4 S- \
  36.     $BOM = SearchBOM($content);
    . `* `7 @' g8 A6 Y* |
  37.     if ($BOM) {; }) {& B8 l9 x. B$ L. G8 V
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;/ k7 f7 g; ]+ q/ i, Q
  39.      // 移出BOM信息; u; J( F" b2 W9 I& x/ a
  40.      $content = substr($content,3);# E% ?; M& d% g9 o& ?8 l4 g/ ]6 R
  41.      // 写回到原始文件
    ; m$ _7 D* j: A! l: A2 g* g: X0 d
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    6 a* K- c9 }5 Y: I, k) a
  43.     }
    ; O4 I+ a" L$ s
  44.    }0 O( ?0 d3 z) j  F
  45.   }" t0 N) ^) d( X
  46. }& p; i+ Q( N; [2 M/ E$ g( B8 o
  47. $folder->close();6 F& {) \* s5 G! p
  48. if(count($foundfolders) > 0) {9 p! _9 ?$ A6 i0 ]
  49.   foreach ($foundfolders as $folder) {
    & R3 J& P- ]9 m
  50.    RecursiveFolder($folder, $win32);
    6 {, y( N+ |" g4 k% p# d  A. O
  51.   }* t8 V$ m1 U  v0 {% K
  52. }
    - l2 w( S" t, V/ {6 X( j5 r
  53. }
    / n' H7 K% K7 W' s. l* _
  54. // 搜索当前文件是否有BOM
    ; w! c5 N) B. j
  55. function SearchBOM($string) { 5 [- S( F! A) c% P9 r4 {* w9 W: z
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;) g; D; G6 B# {2 I
  57.   return false; 5 n8 y& J. @8 s) T
  58. }: H2 [  d* w, N# U
  59. ?>4 K; ~! I/ _8 g4 n* ]) K
  60. </body>; F* J$ ?! {% z) `+ w$ r
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
% k- n& v" n9 h8 F1 f1 K/ _4 p) X6 w) v4 F4 n

本帖子中包含更多资源

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

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.