开启左侧

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

  [复制链接]
62928 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  : v5 K7 V+ O# C' d) e6 k4 O
& A: e1 J) Z" @% ~2 ]5 R: o
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
, C( ^, Y* G7 f3 x7 S
1 F1 s) s/ Z5 s, r  C" L4 A它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
& c; V  c1 _0 F% e' ]2 o2 \( Z* U
3 g. c0 |4 L+ K- A; q$ \( v  t对于一般的文件,这样并不会产生什么麻烦。- g7 P1 l3 f2 h- V5 [' v( [  v# R
1 D. S; ^. ?( a
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。5 n8 P1 h! X4 i1 N" N' D0 L

8 J5 }! d! W8 \/ V' u根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
: ^7 f" A* N* @
( Y, V% V6 h9 {2 L/ y$ c5 }由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
5 i7 A' B4 n) s4 m+ x
# |- G1 i1 v# L  u1 {# P6 V直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ! e9 d6 B( J: p1 j8 M, Q: U+ `
7 _% M# \4 W3 @8 Z# b* Z( U, M; y1 r
然而文件比较多,又想偷懒下,使用下列方法来实现。  : S  b3 y+ g- Q8 s( D) {5 Z2 q
( d' T+ k$ ], Q7 E  r
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" Z- @' _3 [- y- z9 u: a' P# r- R  Z* L
9 V" `; E9 k9 ?5 t2 V' L" I
  1. <?php ! O3 ?% ~4 V$ _/ C& V( O
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 X" Z4 G; Q- a
  3. $HOME = dirname(__FILE__);
    , p" H$ c0 @. |- Z$ f$ {
  4. // 如果是Windows系统,修改为:$WIN = 1;
      b$ \/ {4 g2 t1 k
  5. $WIN = 0;
    % E$ \5 o: c0 W, k- \! D
  6. ?>
    4 M0 E- O( C! n7 Z& k1 L/ V
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">6 h3 p6 P8 j& T
  8. <html xmlns="http://www.w3.org/1999/xhtml">5 c9 q! x- J! S9 H" \" W. B
  9. <head>
    , o+ D  @$ u+ D- C
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    9 W& K" S" N2 Q7 d7 m5 G
  11. <title>UTF8 BOM 清除器</title>) H4 h1 v4 q! Z) n& q
  12. <style>
    + t* u$ H2 A: o3 w
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }- d% ?4 u$ y3 u- N6 {0 I
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }+ @) J2 r% ]! h9 n# [- b
  15. </style>( I% t7 I- l9 S$ N3 V
  16. </head>/ J. J# N/ k/ x0 G
  17. <body>
    ! G* l# U  i! h6 a% k
  18. <?php
    % Q/ Z8 T9 a0 m
  19. $BOMBED = array();, ?( q" P) }0 {2 l# O: L' v
  20. RecursiveFolder($HOME);
    / u: \- h& u6 X# T0 B
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    9 n: Y4 I' u# o! }% {: C3 w
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    3 f. {+ n/ ^8 B+ H! F
  23. echo '</p>';2 B, C0 c0 _  {7 p  t! H/ w
  24. // 递归扫描
    ; ], P6 B( v; Y* c/ U
  25. function RecursiveFolder($sHOME) {3 @3 {3 H; E+ C3 Y
  26. global $BOMBED, $WIN;/ v) {8 ^" b. |( o8 {7 v9 @' T. A
  27. $win32 = ($WIN == 1) ? "\" : "/";
    5 N9 p  z: h, y/ i+ k  ~$ Q* d8 w
  28. $folder = dir($sHOME);4 r! l' @4 O" ^6 U9 h
  29. $foundfolders = array();" T, G( F2 @3 y2 k0 f! N
  30. while ($file = $folder->read()) {
    4 M$ X' o. o" v+ ^0 v( `
  31.   if($file != "." and $file != "..") {
    ) L) O1 ?$ ?7 B' v2 q. x$ t
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    # u/ O9 }: Q3 d: I! u9 t8 ~' _4 L
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;1 |% }' Z- _' [+ {3 q
  34.    } else {& @: @' @( w+ T" M. |
  35.     $content = file_get_contents($sHOME . $win32 . $file);8 O; n7 K3 p8 F. n" r  @; S
  36.     $BOM = SearchBOM($content);
    ) `+ b, ?7 y$ A- m* L# B3 F
  37.     if ($BOM) {
    & P  O- E- [, y' J4 e+ L8 e
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    $ q, h! F* k- J" r
  39.      // 移出BOM信息
    4 p( u  o" u$ n
  40.      $content = substr($content,3);4 p+ f3 D$ L5 m6 O9 G3 [
  41.      // 写回到原始文件9 w2 l& i) e" S- N7 E
  42.      file_put_contents($sHOME . $win32 . $file, $content);: x) w5 Z$ Z$ |  Q9 O4 h
  43.     }
    2 S  E' a: k' ~% z! o
  44.    }
    5 |( T& ^7 K6 V, r# e9 l
  45.   }" W, s4 x, _' t  L
  46. }- W6 u/ v, e; J/ i! q; X% ~# Y
  47. $folder->close();
    # T  s/ b5 y! J0 N! g$ S/ t2 q
  48. if(count($foundfolders) > 0) {0 O: N$ g( G& L( v
  49.   foreach ($foundfolders as $folder) {. d% n5 t) D1 l( m$ W
  50.    RecursiveFolder($folder, $win32);' T9 {! t9 N' q* x9 t! `3 K, O8 u, m
  51.   }" w5 v# Y2 j; A" N1 Y9 \; o
  52. }- W+ @) S) H! d! V2 I
  53. }
    / ?8 t% C/ A1 s9 P% M7 U$ ^
  54. // 搜索当前文件是否有BOM
    3 y. i; `5 s2 E; d) M+ K4 `0 Z
  55. function SearchBOM($string) { . K8 f! q; L* W
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    # X5 f/ I# ?9 N# M
  57.   return false;
    8 r9 n; t. y; r  m7 R2 g
  58. }4 g9 w; W2 P1 ?0 Z7 Y( d- r
  59. ?>
    . U# i2 x% p! o' \' n
  60. </body>
    ; v* p* g4 l, ~! V1 L
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
; K. _+ y2 w- U. K# n
2 D6 g- u/ K! n' ?% m

本帖子中包含更多资源

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

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.