开启左侧

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

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

3 o3 m# F1 N- ?$ i* h这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。5 L# D  u6 f0 t" c
7 D; `- z" C; A+ ^% c; v4 m
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。/ ]2 r( j$ l2 e$ e% `7 g7 t
5 X) Y9 U5 O( ]$ x# E- x6 ^
对于一般的文件,这样并不会产生什么麻烦。9 P. X+ a9 z% ^: C2 m3 X2 U  ^
; _% ]1 P$ P2 [' p) K7 g
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
/ Y, h; Y3 L* C- d, ^5 P2 b/ w5 E4 _2 Y, h, ?, m
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
, m9 b4 c- v, p1 _
3 V- `  M2 X; a* H, ~, G, J0 `由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
7 Q5 {, s5 [$ C/ q6 a' z# t
% x. F' E' ]. S% @" P* s. U$ O直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ( Y7 n6 k% c' C7 U- }8 c
$ j7 s1 g5 A- v- G, N+ h( x( z
然而文件比较多,又想偷懒下,使用下列方法来实现。  
9 `" x& W: ]* f  r% ]  x: B. H& [1 N& T9 |; Y6 g( f
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# y9 q& K4 E* }5 L- h& q- \( @( f' A1 U8 E$ q  v
% J6 X: x  F( p
  1. <?php 7 |- t$ X7 R' \
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件); z4 y# m5 S% G& B! v+ T5 k& o; T
  3. $HOME = dirname(__FILE__);" l5 x% u* @1 Y( b5 K* [
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ; H5 g) I" z. ~8 @3 c+ {) d2 K
  5. $WIN = 0;; r( _: v1 ]5 T( G4 _: J" _8 f2 f
  6. ?>6 e8 e4 N: U2 H! T; D# _, r2 j
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">1 v4 B' p& A) M3 ], O  A
  8. <html xmlns="http://www.w3.org/1999/xhtml">7 [$ o* I' J& F; X/ P* [2 j/ Y
  9. <head>7 b/ |7 g) Q/ V1 a3 k
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />* P$ I2 a1 q5 D& d! o+ R
  11. <title>UTF8 BOM 清除器</title>
    ' u# m7 e; o  F- a0 ]3 O" s
  12. <style>9 a) f* I  J8 D+ o* D
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    6 S  @) o, |% Q
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }1 ?0 G( @0 `5 P" d
  15. </style>( G. u0 w- R* Y5 O; m. k8 d
  16. </head>0 w6 k& [  U# b: v
  17. <body>+ r4 g0 O8 D2 o/ K* T& G6 [3 ^9 ]
  18. <?php% ?+ P, A" |6 t, ]" n1 W) J
  19. $BOMBED = array();
    " S9 K$ Y; z0 {7 H' D
  20. RecursiveFolder($HOME);
    / ]* m5 R8 Y9 r( k+ ^
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';9 y1 V6 |& Q9 K3 t& |
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }* f% T, {" c2 `
  23. echo '</p>';
    ( ^- g5 u" p# O& J( S
  24. // 递归扫描6 H4 N& q+ e) p$ i- w% A: M
  25. function RecursiveFolder($sHOME) {
    ; u! r8 H' K) w
  26. global $BOMBED, $WIN;
    ! W( l5 X+ m* N' }6 G/ V# c5 p
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ) Y; d% Z) _. `; x5 r
  28. $folder = dir($sHOME);, n2 v5 v5 j' ~3 ]5 n( {! c( F* C4 Y6 C
  29. $foundfolders = array();5 I) z8 z2 X9 q, A$ ~9 c
  30. while ($file = $folder->read()) {& y- ]7 T5 e( f
  31.   if($file != "." and $file != "..") {
    ( q- k; v/ |( j
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    * p$ j' |1 h: j
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;9 i( t2 r& ]+ |" B
  34.    } else {& g% Y# @  e% K, b
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    + o: ]& q' L3 H- g
  36.     $BOM = SearchBOM($content);
    , u0 C; f9 M' a0 v, p4 Z
  37.     if ($BOM) {
    % y5 o* J  F+ G1 c* e% `3 V% E# M
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;! d) M3 n8 c- K1 B3 O# y
  39.      // 移出BOM信息
    4 _& c) _" ^. X- ^3 a! [! p# q" ?
  40.      $content = substr($content,3);
    ; {: c  E: O! F' v
  41.      // 写回到原始文件. |9 q9 y5 k- }$ }, ~
  42.      file_put_contents($sHOME . $win32 . $file, $content);8 n  r8 E* J, ~# O9 g' U, b
  43.     }
    9 ~# C0 J' y" Q, j" c+ X0 k; N
  44.    }
    ( I# S+ ^) q2 E
  45.   }
    " g1 a7 c. X1 _2 K
  46. }' ~: L" B+ R- P* t
  47. $folder->close();
    , T! O, p2 c/ H& u
  48. if(count($foundfolders) > 0) {
    4 A$ a, j2 E  _$ F/ A% `  ^
  49.   foreach ($foundfolders as $folder) {
    4 k; `4 x& l, d( k4 W  o0 o% ~
  50.    RecursiveFolder($folder, $win32);
    ) F$ ^8 t+ B2 }. u1 Q
  51.   }
    ; r% A# |% O, l& q- V, G% S
  52. }
    " Q! g, \7 O0 J. }( W* U
  53. }! u. f7 w# A6 M) N
  54. // 搜索当前文件是否有BOM; N- c7 \# j' k$ ^5 X- U3 \
  55. function SearchBOM($string) { : |  ]+ G" ^  ~& L4 ~8 I# ?( \
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;5 s7 q0 u4 ^5 u- R5 k9 i2 p
  57.   return false; % n) x6 k5 b  y; Y) f
  58. }3 s* C1 i0 _, t
  59. ?>
    ' O; A1 H# Y' F2 c$ T+ `9 j! w  M4 ~+ ^
  60. </body>
    7 E" _% @6 Q1 K; S( a1 F; Q
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
* r: B" X+ B  |9 |
: b2 G% s" G4 O- r% B2 ^

本帖子中包含更多资源

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

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.