开启左侧

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

  [复制链接]
62927 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
2 E3 S7 c; m0 Z- T" J
; @2 C6 Y1 n  l  u3 \- v7 Y0 L! a这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。* s" P! u4 b% Q* n, Y  t2 T
! F. }. I" q1 T, X2 s
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。7 p+ Q. S+ Z$ U  D5 ~7 C, c8 Z

* L8 Z. o- u9 P! v对于一般的文件,这样并不会产生什么麻烦。
+ q9 z& X9 W: Y  B' M; _: M) C7 t' o0 A# U- x3 Q, F: s
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。' T$ K( ^/ {% g$ z2 `; ^) P9 K7 _
8 V5 y$ n* ]4 u+ G! P+ h% C; J8 n6 A
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。# O# p7 u+ }9 H. L+ `7 p' c

7 M4 L" d+ W3 R由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
  |5 p+ R8 Z0 k" r2 D. V( W; O; |' ]
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
4 v, K- U( e4 I; A+ D2 ?  `- N1 G, @* j- v9 g
然而文件比较多,又想偷懒下,使用下列方法来实现。  
5 k4 ~) V5 N& i' j5 G% n' q5 k4 c" g' F
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换2 |3 ^( Z$ K5 s0 Z5 Z7 P2 c
1 t, N( ~. Y" n2 T' L# ?

5 i4 t9 b' M( Z1 l0 n9 {9 h
  1. <?php 2 ?8 h6 r9 d4 \+ P  A: O4 B+ E: E
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件), B- C  T) [: U7 Y
  3. $HOME = dirname(__FILE__);
    - F( Y# ~* k7 a) W8 [8 ?5 b9 x
  4. // 如果是Windows系统,修改为:$WIN = 1;% c2 s- n7 n" F  f
  5. $WIN = 0;2 W& W' I+ ^- q: C/ ~8 [
  6. ?>" d% h- _  X4 R- F* z
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) p+ M6 X4 v1 V3 |7 S7 Q0 _
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ; X  A4 w$ [2 g$ y) R2 {
  9. <head>2 c+ X4 B) x+ P9 v7 v: M
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      K- ]( R4 h3 l
  11. <title>UTF8 BOM 清除器</title>$ c' v. ^$ k7 n9 k
  12. <style>( \( z; g+ |2 \9 ?7 k5 G$ Z( a
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }/ U  M7 v4 s0 ?3 n1 L
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ' N3 }6 t' J# J7 e$ N8 \; R  R2 S
  15. </style>" W  a7 H( C& K6 S
  16. </head>
    ! Y+ j* g# F1 b' S3 O( D( K
  17. <body>
    * `2 M, n" m" O" v9 n
  18. <?php
    4 E* Z- e! l5 @+ i% w
  19. $BOMBED = array();$ c: G) y. S  @) ^$ ~' i0 y& e
  20. RecursiveFolder($HOME);
    : a1 {8 c( T. {% ?  N
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';  }5 k' }" Z! R  H/ c3 U: L/ {
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }$ [5 z1 p( t8 x2 Q  T; R( q
  23. echo '</p>';4 m# X3 n8 H% Y
  24. // 递归扫描5 H: F7 y8 w: |! d, ?# |
  25. function RecursiveFolder($sHOME) {. z/ R# W% @( ?$ s+ n9 n/ {( T
  26. global $BOMBED, $WIN;
    : n- h! o3 X3 z( b. s; c9 K' J
  27. $win32 = ($WIN == 1) ? "\" : "/";2 I/ e$ O5 P! e+ }
  28. $folder = dir($sHOME);
    5 C& b7 W$ G7 `2 x4 p; U
  29. $foundfolders = array();
    . [4 b: V: o) h3 `" y' }# D
  30. while ($file = $folder->read()) {! k* K* B; b& }7 l; B; C5 m
  31.   if($file != "." and $file != "..") {8 z4 D$ w* n( G9 g; i
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    8 z7 i) f( J, A
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    " l% @& A0 x! E# d; t
  34.    } else {
    - c6 H$ w+ Q4 P$ K0 V
  35.     $content = file_get_contents($sHOME . $win32 . $file);, F1 Q* g2 [1 J) M$ m
  36.     $BOM = SearchBOM($content);* Z3 c1 T+ A6 |; R
  37.     if ($BOM) {
    # n3 ~9 I$ A3 i/ |' f# I
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    ( y: H: G# J8 t) i7 ^
  39.      // 移出BOM信息; d+ o1 F" x& E) \  x: u( V
  40.      $content = substr($content,3);9 R8 k" P# w8 i6 y
  41.      // 写回到原始文件
    0 C6 ]& B9 P* U
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    6 u  m! u4 e) `
  43.     }
    9 Z4 F# X6 V; i1 v, D. G
  44.    }* q! x5 o, I' n9 q( m
  45.   }
    4 k6 J& C" R' r+ c
  46. }
    & j3 s- y9 y5 D1 V1 {5 z0 c
  47. $folder->close();! c9 O. R* w. B
  48. if(count($foundfolders) > 0) {
    # o9 c% _, ^+ F& R! Z
  49.   foreach ($foundfolders as $folder) {
    ! e5 [1 u7 t9 p6 v; ^
  50.    RecursiveFolder($folder, $win32);1 i. l% o* j% N$ s% y1 J- D
  51.   }
    . ~+ A5 ?( x3 v9 ]; h
  52. }# X. x% |6 t6 C$ h! {
  53. }
    / v$ L( {/ }1 r+ `: B8 Q$ h% a9 i4 x0 ^
  54. // 搜索当前文件是否有BOM
    ; p& o* b; l' t; \$ b, H3 U
  55. function SearchBOM($string) { : D4 `5 b2 z2 L( s6 D# [
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;6 }8 p1 Z/ n! y' H3 X, g( e
  57.   return false;
    . b+ ^/ k2 S8 J/ n2 m: b' a8 W
  58. }6 B1 T2 h  ~+ m9 `/ w
  59. ?>
    7 m$ l2 N9 B9 T7 O5 e
  60. </body>
    ! Z8 C2 c$ q; {( A  Z* L; w9 r
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
) }$ S" X( t' v0 `7 `; v: N, ?9 j+ W, P7 e; O

本帖子中包含更多资源

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

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.