开启左侧

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

  [复制链接]
67711 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
5 ~! j+ M2 ?, W' R7 ^: n5 |2 j- F% M
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
) i7 Q/ _+ [! s! \/ {
! U& v6 ^; A7 N+ z; A它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。0 H3 q! o$ l) e# ]- @$ ~8 e2 D, r
4 ?. ~' o  T* X7 x6 x( D2 i
对于一般的文件,这样并不会产生什么麻烦。
1 z6 H' c# o- t' V: g, Q) x3 O
' e) b9 s! h" t4 A/ @, I7 m但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
/ o" H3 W. z6 Z  g/ H# g8 n' N  T+ \2 i. x8 }4 v  b
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。( Q8 }4 [1 m* K. T" ]# O5 L

0 k/ z- n8 T8 K. |  R/ h  Z& r由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
/ d, p# O9 o1 J8 P2 {  f. z: F' Z3 V6 B; J, I6 f' z  p- G0 i
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
! k# V  ~* v/ t+ F6 V0 @. _9 V) E
然而文件比较多,又想偷懒下,使用下列方法来实现。  % a3 V# B9 X6 a4 [9 H. X
4 H7 o+ G( Y) N3 Y) S1 r( b" o
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" a" B: c, m' d% l0 r! f8 B0 {5 _. r, U( V/ U6 F- q5 f

. [! U' Z4 j$ p7 E7 T0 U0 C
  1. <?php
    3 F; b+ i" J, e: V2 D
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)/ i' M' ?! \% ?) M
  3. $HOME = dirname(__FILE__);
    / F0 Y- |6 j; H3 r
  4. // 如果是Windows系统,修改为:$WIN = 1;8 b$ W: h! Q' A# B! E- |: \
  5. $WIN = 0;
    8 h3 W0 I* A* P* G  U& c/ `
  6. ?>
    ) ~% t) v' [- z
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">& Q9 q! S6 P- z
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ( `1 h2 b& \: ?: C  Q( ^1 R
  9. <head>2 W* [7 E- ?! J! j+ ?
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />4 a8 g2 v, j3 _: j3 ~( y4 z
  11. <title>UTF8 BOM 清除器</title>
    ; f0 y' d; v& r$ ~! g
  12. <style>7 ~/ X! Z; x8 r5 `! V+ h& s
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }( {* Y& @* Z# T$ k" s
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }. K" A) Q1 L7 T- B) F% |
  15. </style>+ b$ \. p9 u# e2 S) K/ L
  16. </head>
    # _' @4 i6 {/ ]- W* b* j
  17. <body>
    6 V8 L6 X  Z; x3 \
  18. <?php
    5 z4 G7 V# g  J; @/ ^2 v
  19. $BOMBED = array();. B4 T2 F- v. s* ^9 O
  20. RecursiveFolder($HOME);) O& Y( D1 Z& w& C( h. [6 }
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';" a) ]9 J" L  f% V4 D( ^: V( P4 O
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    " l0 v! W* ]: K5 T0 ~) T( V; ^
  23. echo '</p>';
    : a5 R9 Q  u$ O3 v
  24. // 递归扫描: L0 j; A4 F/ s( z/ w: Z8 O
  25. function RecursiveFolder($sHOME) {9 x: y# a. [( q6 `9 ?
  26. global $BOMBED, $WIN;0 |: v4 t  _/ e
  27. $win32 = ($WIN == 1) ? "\" : "/";
    : b1 A4 x( W5 G" g6 y$ y( Z
  28. $folder = dir($sHOME);4 O- J$ Q- O2 n+ l/ l; ?/ ~+ A
  29. $foundfolders = array();6 h4 ~( L9 `, s, `1 V" _: W
  30. while ($file = $folder->read()) {
    ! _6 u( D! j; b: K
  31.   if($file != "." and $file != "..") {8 b8 I$ h0 |. C, ~$ V6 a$ D0 P
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    & b) A% K7 ^+ W  M0 j
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;* I* J7 S& x% L4 I, z
  34.    } else {- R6 S  k: l9 k
  35.     $content = file_get_contents($sHOME . $win32 . $file);3 Z6 `/ v+ Z; [. c- q
  36.     $BOM = SearchBOM($content);
    * P$ |6 x0 u! p" m# ~
  37.     if ($BOM) {
    ( n6 G/ E. {. r9 e2 L; |
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    " _! h$ h  k+ t# F# @# X
  39.      // 移出BOM信息
    # C% g8 d& @+ Q  V9 o
  40.      $content = substr($content,3);2 s0 T6 |# ^/ c% Z: A
  41.      // 写回到原始文件( r+ r: n! D2 W' g8 V- e1 j8 T0 U
  42.      file_put_contents($sHOME . $win32 . $file, $content);2 y4 L+ o' S1 r2 ~4 M
  43.     }, A- s$ Q1 }6 I
  44.    }
    ; u8 [# q5 }( C( s, S4 N- H
  45.   }! [. A( p7 R) y) _; u
  46. }3 K) [( s" T6 A; B' k, p
  47. $folder->close();+ ^" |1 K! x) Z9 M
  48. if(count($foundfolders) > 0) {3 q. T1 C! u6 h) w
  49.   foreach ($foundfolders as $folder) {
    ) l$ [! i8 V9 J& n% g( F2 g1 @
  50.    RecursiveFolder($folder, $win32);
    ; l  M* s7 J3 s% A' @. Z
  51.   }
    ' A8 e8 V" i: {6 W: n2 y- C) e
  52. }
    & k$ P* k+ P' p
  53. }+ a* f! ^% `# i% b, a- F
  54. // 搜索当前文件是否有BOM# n+ Z' i( D9 f& z* s$ ?
  55. function SearchBOM($string) { & U( X# F6 g- x2 i/ _
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    ) j5 D0 G7 |4 p* X4 M2 f$ T
  57.   return false;
    2 C5 v/ `4 Q8 M# G. |$ H1 r8 l% b: M
  58. }
    9 a: z  [- H4 A6 Q% D
  59. ?>& S' @( N% r+ P; e! l0 ]8 H
  60. </body>
    * W" r! [8 p. h$ d& }
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
0 Z" H2 c. ?4 z& N) Z8 s$ d' z( {4 Z1 X) Q# k6 p* {

本帖子中包含更多资源

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

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.