开启左侧

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

  [复制链接]
67966 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
! U( f" J6 P0 h. K8 U
& I6 V8 D, g  S8 u2 v1 Q" I这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。. z8 }! D2 [9 |. B( U" ~
2 b+ ^! G" L4 e7 ^8 |
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。0 D" {7 w' h2 i
$ i& V3 f. p. m# K  [' ~% l5 h
对于一般的文件,这样并不会产生什么麻烦。+ S9 w5 S( @/ w% S2 q/ J  Z
# P  `( {8 u4 c! n" u% i4 V, n
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
. D, f: n  F& z# V4 \6 X# `
1 H3 u( E9 G: |- K* B- `7 e. v根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
0 D2 P! a9 u9 a5 }' k. G3 ?- U# t4 d* z9 ]4 C. j
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!0 l" m. c' [  j% d9 z8 c

! H; T1 C8 S, i* @$ C直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
$ ]- I% J% d6 l7 p: t; t
) c1 ?) g$ L  M! W/ }. r4 |然而文件比较多,又想偷懒下,使用下列方法来实现。  
, Z% S7 l, U2 W" u9 C" x% X! I7 {# }9 [5 J
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换7 t, Y* w$ S+ v3 r" r9 B

* m$ m" E2 ?2 h7 b$ `1 ^4 n7 n8 S; M
% B1 V1 l* ]5 ?; ^# m
  1. <?php
    . i, d5 k/ p% H& T
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    : ]/ O) k0 Y1 |
  3. $HOME = dirname(__FILE__);
    4 A" v! T, b; k
  4. // 如果是Windows系统,修改为:$WIN = 1;  X( J, w( P3 M. z
  5. $WIN = 0;
    3 o, A! Z4 ?" K4 {- S
  6. ?>
    ' {2 X7 r6 B( ]1 H5 \% U# X% R
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 C* W/ o% z' _0 B" b
  8. <html xmlns="http://www.w3.org/1999/xhtml">; a6 I! m' U3 P
  9. <head>
    ( K! S( C- J" V4 ^9 W3 J: I6 ?9 y( g
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />( u% }. l' a4 H7 J/ b# v5 K
  11. <title>UTF8 BOM 清除器</title>. k, u0 f) c7 \2 F4 x. ]! J, E
  12. <style>9 a) _- W3 `* z' k% H  \
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    9 c2 c* V0 t% V9 [& k  p+ y
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }. {* ~  I" @- o8 }( A, P
  15. </style>  j" @" j7 S/ r/ H7 }
  16. </head>7 ^. R, l0 F. h  l) S: h2 B+ m
  17. <body>6 P  |& c7 L5 O+ Z, C5 Y
  18. <?php1 k3 u7 ]; O! h* A
  19. $BOMBED = array();
      S! w" t2 P8 a5 n
  20. RecursiveFolder($HOME);
    - J9 B' f  f0 h0 n; q* F" Y3 {9 H
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    + p& u0 [2 x5 G
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    & u. E# x* f8 }
  23. echo '</p>';4 r5 ~2 s! j$ l! V* \9 T& |
  24. // 递归扫描
    / k* i5 S3 F2 f) c% ~$ G
  25. function RecursiveFolder($sHOME) {& r1 H5 B, N5 t9 x3 ?
  26. global $BOMBED, $WIN;! U/ N8 M4 Q( n6 E  y; d4 X
  27. $win32 = ($WIN == 1) ? "\" : "/";
    , W9 o* J: r' Q8 k1 O: o
  28. $folder = dir($sHOME);4 _4 I% G; R: m  }" l1 e: N6 b
  29. $foundfolders = array();3 Q  b1 W$ s  H. [" `% s5 P( i
  30. while ($file = $folder->read()) {/ q. h0 c7 L. s! x0 V% K) G" F9 H. w
  31.   if($file != "." and $file != "..") {. C' k9 _. X, w" z' {  e
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    0 e, h: c7 w+ A$ K
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ( B9 l+ X" U( _6 e' O* [9 c
  34.    } else {/ O" L* f. U$ q: I+ e" `" q5 x
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    % S! `3 B' b1 K9 G9 e5 u
  36.     $BOM = SearchBOM($content);
    7 Q1 s: v" k3 p3 M' K! g8 I+ U
  37.     if ($BOM) {/ z' v4 f; _) O, ^0 e& T1 J+ o7 h
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;' [! }; ~( y8 O1 g
  39.      // 移出BOM信息
    ! h3 `  P+ z1 ^5 \( ~
  40.      $content = substr($content,3);
    ) I* r1 ~( _) M, B' q: p' d: B
  41.      // 写回到原始文件
    ) \1 e* f) _% d/ e4 w1 g
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    , @( A8 ?6 `( R( ^- W2 J" K
  43.     }' L' J# R- G' k3 Q4 B
  44.    }
    # X6 C, m6 {0 Z
  45.   }. i: }; ~$ [9 G' C
  46. }
    % r# O6 K/ N7 c- H
  47. $folder->close();
    5 \5 v" r, {, U6 y
  48. if(count($foundfolders) > 0) {3 S/ N8 p3 W9 @+ T8 ~
  49.   foreach ($foundfolders as $folder) {
    ) d7 l8 J- f9 E3 |3 o# C
  50.    RecursiveFolder($folder, $win32);% ]# i. O# u  P9 j7 H3 L) ]) B
  51.   }
    5 [- v8 S$ U1 Z( k$ ^$ ~
  52. }
    * r2 L, ?8 |5 a7 o9 _( ?
  53. }, v$ ]9 C& \$ l/ p* U/ l
  54. // 搜索当前文件是否有BOM$ ~3 T5 E9 |  v
  55. function SearchBOM($string) { : U* M6 t" N% d) R
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    6 Z1 C. h/ C8 _. P) I) _% {* d
  57.   return false;
    9 a" T6 w; Z1 Y. @. Q
  58. }
    , s" k( u% N' G& p1 D' v" C; w8 Y7 s
  59. ?>4 ?3 H# U1 C  ^
  60. </body>' I8 l1 j# F% b, W; r
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 ?+ G& J$ D9 M6 C4 p
/ Z3 K* |! U  N* ]5 @3 `9 R7 H6 x

本帖子中包含更多资源

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

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.