开启左侧

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

  [复制链接]
67806 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  " }3 ^6 l" Q0 X  c( R  M  ^: F( T3 X$ [
9 K: t% O3 [2 @+ G$ N: p7 Z
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。# e( z1 K/ D) m# S. G, K3 L) w' j

1 L; D% l+ I( Z9 R) Z% C它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! b- H9 y5 ^3 v/ G" q& L; q6 l
  s# C# o$ K6 i1 ^: \
对于一般的文件,这样并不会产生什么麻烦。
! c/ H7 j2 t5 U6 ?/ ^& B& M7 `2 F# _( p5 Q$ Q" s& g" Z
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
, Z# @1 X* [2 f( n. Y0 Y' o% M- B* {$ L: s
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
  o% H1 ?" ?5 k& }* t# c' x8 S; r  h7 t" t0 [2 I; i; D: m; K# P' f5 T' X1 n
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!: Z- W! H! d  X1 h( t
1 ^+ [% Q5 \+ a& g
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   4 ?* ~1 O+ H5 \4 o

9 L$ X! [! K$ p3 ]% _( A然而文件比较多,又想偷懒下,使用下列方法来实现。  
  M/ R1 m. _6 C( T
4 V  |9 t. k' m) N& [将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换6 ~9 [7 I% i. V$ [7 k, ^' U& H. p

7 A% t9 U4 I' u  |+ S$ H5 {2 K% V! m: N( w, E/ h" ^: t4 S
  1. <?php
    4 _7 d/ I* \* ~8 u% q9 c
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    6 I! v& i7 @9 h, l5 B# v' g4 e
  3. $HOME = dirname(__FILE__);
    4 I3 S: x/ b( v
  4. // 如果是Windows系统,修改为:$WIN = 1;
    1 w$ R: R" Q; o# V6 U/ c  s
  5. $WIN = 0;: c7 N& ^% G( W: q
  6. ?>+ f( c; F; O+ `- v( p# p$ h) e
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">* Q, f3 B" v; S% l
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    5 _9 M2 X* h+ A$ t$ {. q, e" A
  9. <head>- T! N) m8 ~) i1 @
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    2 p: K( R7 y/ O/ z
  11. <title>UTF8 BOM 清除器</title>
    % K" }" t1 l1 O6 }: w. c1 q
  12. <style>
      N9 P- Y! ]. k- d
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }1 v+ G4 x# X. W) \$ f
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }* Q- h% ]  G0 F; w4 A. R( x
  15. </style>' h5 \: ~9 F: B9 u" y
  16. </head>
      K4 G3 U# l5 N' c% Z  H! P( {! J0 U
  17. <body>
    2 h4 F7 B5 [* y" O) u% s
  18. <?php
    . m* g6 a* X9 z, Q$ u5 h; L& `5 t
  19. $BOMBED = array();* r' q9 v- l, n5 _# K
  20. RecursiveFolder($HOME);
    : [5 G& c2 Q% N( k* W( {7 Q7 \
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';" m4 ^) k* H1 a
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }4 t7 H$ S. m0 N+ g" m
  23. echo '</p>';
    1 q# l: L/ J& R* p
  24. // 递归扫描
    6 S- t. N: A7 j( x: s  g
  25. function RecursiveFolder($sHOME) {
    ' |8 R" z/ q+ G+ T1 T0 j" s
  26. global $BOMBED, $WIN;  p9 E1 v  |1 _6 e
  27. $win32 = ($WIN == 1) ? "\" : "/";
    & w$ ?- R7 x: j6 u0 d+ l
  28. $folder = dir($sHOME);
      H$ \* ]0 f! r) t
  29. $foundfolders = array();
    - s+ y+ |9 ]; K! d1 P. R  [
  30. while ($file = $folder->read()) {
    8 n+ l# ^5 u  Z$ Z3 s; U* u
  31.   if($file != "." and $file != "..") {
    1 M$ v$ X/ I: P5 @4 J
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){2 X2 k( D/ `/ H
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;) O8 _# F- g( h1 I
  34.    } else {
    ' j7 d5 \7 t' `4 c, a7 y
  35.     $content = file_get_contents($sHOME . $win32 . $file);3 n1 f6 U7 H0 c
  36.     $BOM = SearchBOM($content);7 g, Q% a. l' P6 @; D% i6 n
  37.     if ($BOM) {4 y! `7 I6 ]6 E6 x  b9 l# [
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;, I$ M9 Y6 }0 z) }9 u6 \9 h+ D3 l8 c
  39.      // 移出BOM信息
    : [2 c' R( C: B" X. u) p
  40.      $content = substr($content,3);
    9 j( M* g) `$ @. Q! j; a
  41.      // 写回到原始文件( l, {/ |' y' ]9 a
  42.      file_put_contents($sHOME . $win32 . $file, $content);5 t7 Q, j0 C: ~
  43.     }! `, P; F* B6 x5 b, D
  44.    }8 z# c! z; u5 {( c$ B9 Y* C; M1 Z
  45.   }; V# u- w5 W" g) m! b, f  ?
  46. }' g3 u4 w7 @6 @
  47. $folder->close();6 F- v1 ]+ c  d) [
  48. if(count($foundfolders) > 0) {! D0 x4 p5 H/ V0 D5 \2 x: s2 I
  49.   foreach ($foundfolders as $folder) {
    % g8 }# k2 F+ d
  50.    RecursiveFolder($folder, $win32);! ?1 b6 D$ ~# F* |5 E
  51.   }
    * d, h8 _2 g5 l1 q2 N
  52. }+ f0 b7 ^: ~, k& `: T' z, Y/ _
  53. }+ ]/ _: @; W* U% w) s/ W/ Z5 A
  54. // 搜索当前文件是否有BOM
    ' T) F$ ~$ m) H5 M0 e  }* r+ H7 L
  55. function SearchBOM($string) { . l2 t3 X0 ]. g; ^, L
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;. K! B6 p" x, r9 n5 k6 ~, \' t' p
  57.   return false;
    : V- @6 F1 l) S+ n* u
  58. }4 {( q* y$ m0 N1 z
  59. ?>: `8 C; b# J& q
  60. </body>
    / W+ X/ U6 l' l4 |# u$ w+ u
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 @$ _3 ?& Z8 R! S
; ?  K) A' s6 z. }& L, M0 _

本帖子中包含更多资源

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

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.