开启左侧

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

  [复制链接]
62931 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
% U/ x# E/ b- W2 _. k2 F; I! G4 y1 F+ F- u6 b- q
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: w% V1 Z5 `8 a- C  r

1 s/ b* f. w1 p% F. Y1 ^5 \: O5 Q它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ q# q- L. ~4 ]0 I. y8 f5 Z: Y6 K7 t# w* d
对于一般的文件,这样并不会产生什么麻烦。
3 O( `/ [& ^- L& T/ R. l% u! S! r& S) \, x7 a
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
5 d! E" I5 R  X! F6 ^! M& H
: i5 ^4 P  x. w: D- ?4 L8 n4 \根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。& n$ W4 U4 o# S4 X

0 }5 G6 L5 R3 K4 S% ~# _由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
2 Y, }% U; q; a: `
. R3 B& [/ Z' O( X- T直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
; A  G) w5 W7 Z: a+ {. p. l1 R! z6 E- P) a$ ?# ]! m1 d
然而文件比较多,又想偷懒下,使用下列方法来实现。  
5 x6 |& S& M0 X: Y/ j8 `( J
, R) F1 v6 d0 e将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换8 g7 y$ ~6 R% Q+ h4 k/ p
' o; H  O/ _( b2 M, z

, \( }2 R2 k2 u; ?3 i: c- \  f
  1. <?php
    4 R1 {7 p9 i' u7 C# t3 i1 t
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    2 P! M6 J" ~" ~) B' V
  3. $HOME = dirname(__FILE__);
    0 e6 j5 W& y9 ?& y# D8 `3 v
  4. // 如果是Windows系统,修改为:$WIN = 1;
    , h. r' ?! E7 o2 Y
  5. $WIN = 0;& w, B& M8 m/ P5 ]9 n: N! c. [0 Z8 B& r
  6. ?>
    7 g7 P0 L6 T% Z9 Z! k9 l
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    3 ]( S+ m6 D! a* B3 N3 ?2 M
  8. <html xmlns="http://www.w3.org/1999/xhtml">$ y0 V+ h# _/ t1 D* x7 K3 F
  9. <head>
    4 P) J* k( g* S/ E3 Z$ @4 y
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />9 y, j; `  {: Z& |7 f
  11. <title>UTF8 BOM 清除器</title>
    0 `4 K( ~$ s. N% I. l- u
  12. <style>3 M9 a5 c- `1 x, Z; G8 ?
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }0 _- P. T* n' ?2 H
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }: B5 Y. d/ G6 [
  15. </style>
    3 u& s: k; E+ h  h. W% x
  16. </head>
    % E  T; W+ I# b: J
  17. <body>4 B# M# h- N! W' p0 B! L: b& _2 ?
  18. <?php; a3 \" u7 U8 X. w' E; X
  19. $BOMBED = array();# ^1 a+ l# J$ ~* B( h) P5 Y
  20. RecursiveFolder($HOME);, S# o( f' m/ O; {5 S# p( A% L
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    , j/ O9 d6 ^3 p+ t  U$ Q6 Z
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }$ F5 l$ }" [! F) M4 B
  23. echo '</p>';
      S- {% y1 X# H) l
  24. // 递归扫描# K& t. E" E2 n. a( K1 S
  25. function RecursiveFolder($sHOME) {
    2 S1 d- ]0 _( a- R
  26. global $BOMBED, $WIN;
    ; R: a6 G$ P( d" Y  g. S
  27. $win32 = ($WIN == 1) ? "\" : "/";3 p7 O4 }& @* o# a. E
  28. $folder = dir($sHOME);6 ?) x- e2 {- L, T4 w# C% \8 x
  29. $foundfolders = array();
    $ I8 I) |; X3 O( e. }& t/ x3 @
  30. while ($file = $folder->read()) {5 s7 n9 s) n5 ^4 C2 m# G/ ?9 |
  31.   if($file != "." and $file != "..") {
      {* _" Q3 f# A7 a6 d
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){0 o& Z- M" @3 H' c% v
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;" K" h2 P6 e, _, r
  34.    } else {- J: V* Z. d: }- e+ Y' J
  35.     $content = file_get_contents($sHOME . $win32 . $file);6 ]3 V+ i+ s8 F8 \
  36.     $BOM = SearchBOM($content);: k. U# u3 [( r) Q9 G5 P
  37.     if ($BOM) {
    6 i5 m1 C# F- K2 {# F
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;2 q# A  e# g& A/ x9 x0 j, ~9 f
  39.      // 移出BOM信息- Q- A& y7 T7 C0 ?' `- A& I
  40.      $content = substr($content,3);* \+ r9 D" O% |$ ~# w
  41.      // 写回到原始文件
    ! c! l8 v# L1 x1 ]8 {
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ( p; z- F& L* k$ U, O8 \/ X, F1 L3 }
  43.     }
    , Y. h: E0 y8 Q4 F3 n* l* X
  44.    }; ]* }6 ^5 V" \6 Q' a, G9 A
  45.   }
    - a/ j& {. I' l! O, q& U
  46. }
    : Q+ P" I" V; ]; x4 h; ]
  47. $folder->close();" M1 f* H3 H8 R+ R, i* z
  48. if(count($foundfolders) > 0) {0 J0 H- f( o$ S' ]3 x- A
  49.   foreach ($foundfolders as $folder) {6 L: W/ U. J; ~+ g. n4 r2 M0 E
  50.    RecursiveFolder($folder, $win32);% G' c0 i6 }; M% j0 W
  51.   }
    ) g$ a7 P' y7 k6 N/ x
  52. }# U( P2 p* ^9 B" g& n# c* b6 V- A3 D7 ~
  53. }
    * Z( D6 i% b: N! l1 x! D+ Q1 X
  54. // 搜索当前文件是否有BOM* a2 c4 Y2 s* h
  55. function SearchBOM($string) {
    6 c( g4 _5 x* a" z  _
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;; X9 T/ }+ r4 f* C# z, J
  57.   return false;
    2 q5 h" F$ s  ~3 P1 U
  58. }
    % K- s( V8 Z2 P# \3 Y, X6 {- F% [
  59. ?>' x7 u* y' F; j- y
  60. </body>7 f9 z. O" k2 _  e: X, t0 }3 |4 u% N( h
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 e, L9 O9 R# C6 w4 H! Z" \# N9 s" _

0 d& T) |" Z* }  @- y8 I. y+ e: e, z/ L) A

本帖子中包含更多资源

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

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.