开启左侧

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

  [复制链接]
62815 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  " |' m3 m5 B& s
; d) F4 I" |+ t8 k0 z, y  @
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。0 [: y8 [6 A4 B5 `0 J( z
0 k" c' b4 S7 P# O
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
: i0 ^7 I( W  Z5 R, I
) z* Y( J  J3 X0 _0 l对于一般的文件,这样并不会产生什么麻烦。
, l, B$ s/ }: g% T6 h' C2 v' o; J4 J3 T+ Q8 V3 L$ M
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
/ O- @6 \- t: Y1 {0 p) m# `6 [7 c# O9 T& q& m3 a9 }: Z* t
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。! w1 ~3 Z8 T  Q: h
) p7 e: k8 C; n( D9 w, T
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!6 x% e- {1 b, r/ f4 r/ F% ?

3 k$ w' g& m7 W' a( v+ j直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   1 o3 e7 Z: {+ m: _1 B- K$ t3 a, g5 n
. Y  W3 a& @: k8 W; l$ i
然而文件比较多,又想偷懒下,使用下列方法来实现。  
& c7 Q6 C4 I& [( U( y3 a+ D& {( j; h
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换: T! R/ ?% @% T) W
$ y- G! n- F7 f" p4 ~
$ j+ x2 B/ ]1 w' O
  1. <?php ( ]- u+ n; `$ h3 C3 l
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)+ l" @7 v  l2 @0 a
  3. $HOME = dirname(__FILE__);( [. n2 Q  |5 X2 Y6 e+ ?
  4. // 如果是Windows系统,修改为:$WIN = 1;
    1 f3 z* w8 _, b8 X
  5. $WIN = 0;* ?5 z6 C8 H  d$ R" f( E
  6. ?>( ?0 H) ^4 _$ k
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">6 L2 M# G: H% t  ^$ h! r# R$ U3 W+ b
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    - o: o4 `" I( Q! o5 T
  9. <head>  E$ t" ]5 w" u
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, E1 L& E$ @6 L# ~7 s# r% L  I
  11. <title>UTF8 BOM 清除器</title>
    - P/ H) i$ R$ Y7 l5 a
  12. <style>
    7 N8 U7 Y2 d2 i+ p4 z
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }' G! V: P$ P! R1 B) i
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    3 n& E9 o, A) w: n% d3 o0 H" Q
  15. </style>* V( K7 j1 |4 b
  16. </head>
    ) y9 M3 @- {& Z! y. r7 t3 B' _
  17. <body>
    9 B. l6 Y4 l8 h
  18. <?php
    6 _$ s* {, P; {' W5 K8 v5 k( k
  19. $BOMBED = array();
    " C4 C) @0 ?# X9 `# X  I
  20. RecursiveFolder($HOME);- D: {( f$ M. {8 @: K% ]0 c
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    # g* }4 q* T3 Y$ v# X& W, ?
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }5 a. i  M1 [% o1 P
  23. echo '</p>';" ^+ @, U2 Q" S2 C. H1 {
  24. // 递归扫描! S5 y# R8 @9 f' p' S
  25. function RecursiveFolder($sHOME) {- H" T: M& s% T! L0 O2 S
  26. global $BOMBED, $WIN;) O) x4 E. ^* O4 Z& ?, `
  27. $win32 = ($WIN == 1) ? "\" : "/";0 K/ J- t& N4 m) d+ N" l
  28. $folder = dir($sHOME);8 r. u* G6 |0 A
  29. $foundfolders = array();* D( R+ |" |& Z- A% k' @9 @
  30. while ($file = $folder->read()) {% b* K4 W) }7 Z2 ^# O
  31.   if($file != "." and $file != "..") {1 @6 k) ^: Z, \2 J, J/ E5 u- E
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){: I7 Q4 l' D8 P1 `5 v4 V
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;6 D7 n9 T8 r+ Q$ j
  34.    } else {) N' ^- f* u/ w6 V( W
  35.     $content = file_get_contents($sHOME . $win32 . $file);' a( R1 \/ r$ F' U: B6 S
  36.     $BOM = SearchBOM($content);8 X5 e1 B" n9 \7 ^) ]$ g8 J) [* o
  37.     if ($BOM) {  _' P( a; @5 V- W3 _% F; Y7 q  N
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;: ~% t8 z; J6 z; s$ N# c
  39.      // 移出BOM信息
    0 T( T, ?( r* t& v$ f; a* x
  40.      $content = substr($content,3);& E6 `, Y# b8 W* a: N
  41.      // 写回到原始文件
    % X, f$ F: H, b1 N, {$ m' C( N8 H
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    & F( \- X! A- M) H% ?
  43.     }# ?" ^. Q) }6 D( X
  44.    }
    " k; K  M- J5 e2 y- _2 `
  45.   }
    7 {% U1 }$ I6 V
  46. }2 z& o, z6 i& B8 t# D
  47. $folder->close();4 c/ U( s  U: w
  48. if(count($foundfolders) > 0) {
    " t8 c2 T+ z/ [; _
  49.   foreach ($foundfolders as $folder) {. D% H. Q; I# O# d% |
  50.    RecursiveFolder($folder, $win32);2 J/ N2 c, @: {: T, l( j
  51.   }" t3 W3 H% N; r& |* x
  52. }. i7 @0 B8 o0 I7 U1 H
  53. }5 n% B& U0 U! M. U
  54. // 搜索当前文件是否有BOM
    7 y6 g. C* H7 H
  55. function SearchBOM($string) { ) [: {* L4 k8 L% m0 Q
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;; ^: T9 ~% S- N) [6 }
  57.   return false; 8 W7 C* ~) O' k4 w7 j' Q* }
  58. }
    : O' I0 b, f  ]/ N. t# k* r* V
  59. ?>9 v( b5 O. l. W, r- d8 N
  60. </body>
    ) B, f6 \: \/ H' e! ], \
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
; \5 C8 N! _! m9 a9 W
" o5 I' Z# M: b% R+ V8 Q

本帖子中包含更多资源

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

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.