开启左侧

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

  [复制链接]
67294 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  ! S6 N5 U5 Z" z; _; C
& J9 a% w- v( |/ Y6 \9 z; f3 X3 j
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。9 E( j- N1 F: u  P1 f/ r5 y- V
  _1 j7 R/ r# Z. i; S6 {% O
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。, Y, H! e& q  E: q# T

" m6 c$ t8 {+ U对于一般的文件,这样并不会产生什么麻烦。
, |( G; H2 `) b( p" i! [$ h' l( L3 I( L  P7 T
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。& n+ _7 e5 C, ~0 e8 d3 n/ c3 Q0 h

- `9 y( S5 ]  l! j  [. ]根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 w% ]! N& L- U$ z% Z% h( m3 q* f. P

1 ^8 J& B5 Q6 y- _! Y" Y由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!% ?9 p* E( X7 c- a* C
3 R1 |, s6 ?- g: H& H' N
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ( F+ a: J8 L# i( o
" C5 K& j2 F# r% I  s% [( A9 A8 f' x
然而文件比较多,又想偷懒下,使用下列方法来实现。  ) d  {) u) r) M4 I

( C1 {$ t0 x- G6 i将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
' }% L5 l* N( q. h( a/ @8 s* [/ v0 I$ E4 w

( [: K% L+ D6 I0 ~5 l
  1. <?php 1 N% G' `$ W6 F/ }- _. X
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)2 C& M2 o9 f& _- O5 M) v
  3. $HOME = dirname(__FILE__);
    * l: M8 n7 T# d2 L
  4. // 如果是Windows系统,修改为:$WIN = 1;
    # u* Q+ B/ u  I6 O4 K
  5. $WIN = 0;
    $ ?2 h& h9 _. T# ]* I
  6. ?>
    7 @. ^( {2 a0 l3 L- C4 V
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">( u9 I5 ^3 A9 o5 p6 k
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    0 ?$ M' B( O( o" g
  9. <head>! g$ n; a0 E' s. j4 X
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />5 B+ i/ k  T# P  o4 [
  11. <title>UTF8 BOM 清除器</title>$ ~; X5 d1 q/ w" V$ @% ]
  12. <style>6 `# w7 C& b0 Z
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    7 V+ A- V  D& C9 W
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 b0 B# v. Z" L& I  {' r+ L6 b
  15. </style>! o7 A& E/ u4 u
  16. </head>
    * S% A2 w6 {  f! E6 }
  17. <body>3 a% v  t& |3 b
  18. <?php
    " `- U! u+ r+ h4 D  ]
  19. $BOMBED = array();  B# r5 X# B# F* A  X% ~
  20. RecursiveFolder($HOME);
    0 Y* T7 j1 X$ B9 N
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    % T$ W, }; y* i* Q
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ( `2 ]: D( q" Q1 a0 n1 J$ F3 x
  23. echo '</p>';, [* n/ B$ ^$ \. C- K
  24. // 递归扫描
    7 W  J$ h0 K2 ^2 W& O
  25. function RecursiveFolder($sHOME) {4 B8 L. Z* _/ w9 C, E
  26. global $BOMBED, $WIN;  a, z' v. V+ h; ~/ b: v' Q# D$ R) A
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ) S; N- u3 k- l& H2 v
  28. $folder = dir($sHOME);
    ) @( b( l6 L' v
  29. $foundfolders = array();% S) t' q- h0 v( F& n; d% c
  30. while ($file = $folder->read()) {7 m' h6 n7 K2 g6 v+ d4 d
  31.   if($file != "." and $file != "..") {' @4 a% Z: h* ~7 u' K4 M: U
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){* H5 A- }+ \; x! Z( A
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;7 a) `0 t! [: N" O
  34.    } else {
    - ]# j8 _0 C2 x5 |
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    & x. L0 @9 S/ X. J  Q. s$ M3 E
  36.     $BOM = SearchBOM($content);) W$ h+ s! ]4 y9 M
  37.     if ($BOM) {
    1 l: q* y/ U) O# c" d+ o
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    2 H- m& l; [% V! g. _; ?) x  g
  39.      // 移出BOM信息8 @2 L9 s) K, g1 ~& l
  40.      $content = substr($content,3);
    7 g/ ?3 i$ K+ W8 I) e0 w
  41.      // 写回到原始文件8 `  v* p( t. d" q  ?
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    # b  W* b1 O! z
  43.     }" H. P: q" m0 j# n8 S! s7 |' q
  44.    }2 y9 m/ B3 @0 I6 u' {7 G( Y
  45.   }0 R5 c& h7 n6 b1 L" X
  46. }0 o8 a$ M8 R' v# _; @$ m' g- i/ `
  47. $folder->close();3 _- ^* G' \/ z2 g
  48. if(count($foundfolders) > 0) {
    8 C4 U2 Z# J  Y/ C5 R
  49.   foreach ($foundfolders as $folder) {1 ?3 d5 s: M! J
  50.    RecursiveFolder($folder, $win32);
    6 L/ o5 Z2 V% z" O
  51.   }
    6 h; g. o2 o0 v8 I
  52. }" x5 p) \5 Z, J/ j9 q- @9 _- g% ~8 e& N
  53. }
    6 B+ F4 W7 w" h6 g. @9 r# K
  54. // 搜索当前文件是否有BOM
    - Q. B3 @* K) K. f
  55. function SearchBOM($string) {
    - ^/ b: h) a8 ~- h. \( l3 S
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 k# Q% Z7 f0 g$ T: n3 V
  57.   return false;
    ) b# k7 n0 ?: J( J
  58. }
    . {1 `/ g/ T! W& y, q# }0 R( a
  59. ?>7 v: f' f7 L/ D6 I% e# G
  60. </body>
    ' C2 p1 v* e5 Y7 z
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
8 J5 U9 H! d1 c; N, N1 s5 t$ I6 v- w+ ^6 Z

本帖子中包含更多资源

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

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.