开启左侧

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

  [复制链接]
67105 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  : y# x5 w2 }- z& O

; R" y! G3 A* x6 S这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: V: r9 K7 j8 ~* |- G
3 S5 @" e$ h% K* b. D* M' |- e; v1 f+ Z
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! |. I, r. }% T& }0 C: Z* `1 r7 o8 v
* ?4 j: |6 @1 g$ I: |
对于一般的文件,这样并不会产生什么麻烦。/ F4 t7 C- T8 ]+ P' w0 ]
9 ]0 B, `9 R! ]- k6 T
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
* [6 q) A5 W: X* f! t7 H
. b$ i9 ^  ]- S) Q4 d2 L( a" @根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
5 L2 N7 z$ _8 P2 d* B6 G1 K! e; k: r- F9 O
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
1 F+ q3 k' Y+ X  v
9 r2 ?' \: A  s3 I+ v直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
# w8 ~" |& R0 A% R1 Q! q2 l0 ]6 L4 N4 y! j
然而文件比较多,又想偷懒下,使用下列方法来实现。  # r  b9 w2 s. b, x; Q$ @
9 e6 p) v" ^: E; ]& B) ^
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换$ s  o4 Q' l/ N4 o  j0 s6 X. [+ {1 q

+ k% _; M  ^; T4 v$ Z+ m# t3 u
' P7 x6 v9 m4 e! K" s8 B" X
  1. <?php
    - q4 k( q* t! R* R
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    9 f$ {3 x4 ^" A  F; |
  3. $HOME = dirname(__FILE__);
    9 c( v0 D7 I! ^* Q0 j, H0 k
  4. // 如果是Windows系统,修改为:$WIN = 1;
    . f# e/ y7 S* Q% n5 \9 w8 i
  5. $WIN = 0;
    $ z+ O/ ]% e& z9 p& _& d
  6. ?>
    1 R( x3 L8 |+ S) k8 e" D8 T5 x9 |
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">% @. R* F' m- D
  8. <html xmlns="http://www.w3.org/1999/xhtml">1 c- l0 p  m$ y- Z) K
  9. <head>4 I) \# _! M* q+ u& Y
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />* v: [8 b1 a6 x- \- X, b: q$ ?
  11. <title>UTF8 BOM 清除器</title>
    / _$ i4 g- p" [# U
  12. <style>! z2 e9 I% z! k1 ?3 r
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    + Q* i9 \3 y( s5 ^# ?
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }. r3 k- A: y0 q% v1 o- v
  15. </style>" ~- L3 c7 E$ y$ b
  16. </head>) A' ?' B* Q" f" ^
  17. <body>- _, ?1 Z2 ]4 t/ D
  18. <?php  Q. P" o# i6 u6 A: _
  19. $BOMBED = array();
    - \, r1 [1 H+ U3 k( m9 G
  20. RecursiveFolder($HOME);
    & o2 B; c8 o/ `# U: k$ P* d# H
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';1 `. j6 |9 D1 J
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }3 K% x/ y) t! f1 I
  23. echo '</p>';
    7 v( m1 v  N, e$ k0 u3 L0 d
  24. // 递归扫描
    5 o' @' v# G3 x- [
  25. function RecursiveFolder($sHOME) {$ l, m9 b% M8 Q
  26. global $BOMBED, $WIN;
    " t  U# q+ Q& R- F/ g6 ^- b, p( g
  27. $win32 = ($WIN == 1) ? "\" : "/";# Q! \/ j2 b/ }: S8 _) C8 k  i* h
  28. $folder = dir($sHOME);
    % p, ~3 o, e& L+ E( m3 W, m
  29. $foundfolders = array();
    " Z4 q$ x9 y1 ?7 Y5 M% G8 k
  30. while ($file = $folder->read()) {/ q* y4 d9 I7 w( e: j2 k
  31.   if($file != "." and $file != "..") {
    / K9 E7 `6 \4 ^: ?
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){. F8 T7 y" z/ i6 S6 y9 \
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;& z+ D6 h# R. e, z
  34.    } else {' e! M$ m5 Q+ i% ~2 O  ^. y
  35.     $content = file_get_contents($sHOME . $win32 . $file);, T" H7 F4 c9 A( p9 |6 P
  36.     $BOM = SearchBOM($content);; M- }7 l/ ^  W. R2 c' h& h
  37.     if ($BOM) {
    * x& e7 a- l5 l) o+ a% E
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;; Y% s5 v* ~3 c1 c
  39.      // 移出BOM信息
    8 r; x& K2 w6 I; ~$ Z, S( d; |
  40.      $content = substr($content,3);
    ' y- `/ p6 l0 C0 |, T! L
  41.      // 写回到原始文件% C- s8 M% f$ l  N) ^- ^, r/ Z* }
  42.      file_put_contents($sHOME . $win32 . $file, $content);& A: i9 w7 V) t7 z$ ^) x: E2 }0 @  o
  43.     }
    . P* X: W0 b( Q& N7 z
  44.    }( G' r7 f/ B1 {
  45.   }
    / F! y" x& q7 n# l+ `* g
  46. }4 I% j4 N; a' p! B2 C. A! o
  47. $folder->close();1 f6 N' r9 z* O, W# ]/ T9 ~
  48. if(count($foundfolders) > 0) {
    5 O+ i+ L  q& d: T0 y
  49.   foreach ($foundfolders as $folder) {
    ' F8 ]) c8 a3 G5 i
  50.    RecursiveFolder($folder, $win32);
    3 h( b( ~  X3 |+ |, e
  51.   }$ R$ K; O- n. a
  52. }
    2 `- G4 r+ G% z  E! E
  53. }
    " ^1 F0 v" T0 _& M1 ^3 P
  54. // 搜索当前文件是否有BOM. H% S7 k% x; y* X
  55. function SearchBOM($string) {
    % x$ i3 D5 m5 |& n% X( f8 m+ O
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;. ^0 O( E( E0 z: {: o" @. |! \2 g0 b
  57.   return false; 2 X' Q9 q6 Y, {& w- `
  58. }
    + i, O, f( F  b" v9 S9 s" _) ?
  59. ?>
    / E) A1 q  n# S' h6 n7 C
  60. </body>4 N( ^3 a. v" T- p
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
% S+ E8 n# B" v! |! U* z
, f0 W. J$ |: 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.