开启左侧

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

  [复制链接]
66904 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
) _4 N' W8 Y3 t" q" d% _) D& D+ U. M3 N  [
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
$ r4 c- {8 P+ v* m0 S9 j6 @5 u3 N) C6 X! f" ?7 ]) K7 z/ f  j+ ]
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ v2 W/ a5 @! ~9 e8 i" A' W- j% k& A3 C: D# t; K7 j3 {6 v
对于一般的文件,这样并不会产生什么麻烦。
6 }# [" T8 h6 [1 t$ j+ o" V, Z" x& S# w5 t5 X% c6 }# r
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。; ?( T1 d$ p; p) L. D% Z2 b8 |
8 j# v) L& [! s
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
0 I) n7 N& X- B# X
" g0 q( k. C/ c) M由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!# g3 D; B6 |5 M' ?: j

3 \: |) Y# k6 l  m% h9 s1 O  N5 x直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   + a, ^& t4 M& G3 g" c9 @

# f( H, f: A3 `+ V7 z2 q: w" t8 n然而文件比较多,又想偷懒下,使用下列方法来实现。  
1 Q6 _, Y9 r4 L4 `9 S8 a3 N
4 y  t5 A; ?) e+ H% o- Y* E将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
/ i/ q' S1 ^( R% }4 ?; z8 e6 N# ^

4 j7 Y' [* h: U. e0 ?
  1. <?php
    - |0 P7 D3 D" h2 c' J
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)9 M4 h  }; |: K, L9 [
  3. $HOME = dirname(__FILE__);
    1 O9 X8 r0 F0 D7 m! Z0 F- y
  4. // 如果是Windows系统,修改为:$WIN = 1;: Y8 V' J* B# f9 p4 ^2 T4 W
  5. $WIN = 0;
    5 J+ T' x! c8 E, d  b2 L
  6. ?>/ ]& C' R8 H% h+ q  N
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    ( o( V; g% U& _# R9 [1 n
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    1 K7 v0 {; `+ ?& j. m
  9. <head>: C  B6 X9 c& |( Q# ~2 d1 E2 u
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    # @4 V$ @- E7 T1 |
  11. <title>UTF8 BOM 清除器</title>
    8 y" ]* J2 l, L* Q! X
  12. <style>$ `2 V! A5 O/ f9 X' O: T
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }  ^. @3 q$ I$ ~
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }: P( x0 |; E$ G% Y) [6 \' v
  15. </style>
    2 I( ?: S" W8 \
  16. </head>) j  T' @  f0 l5 C0 f5 a
  17. <body>8 g. W1 l9 L0 S: x' y- w; B6 i9 m
  18. <?php
    1 q% ?' [" F( F
  19. $BOMBED = array();
      B8 M* F3 G1 u  q" r
  20. RecursiveFolder($HOME);
    9 P/ u% p% ~0 t
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    3 v$ T5 G4 `. Z, w2 q- [
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    6 Y2 |1 ^7 p/ R7 s
  23. echo '</p>';
    + I+ R6 h1 \" [  I2 p
  24. // 递归扫描
    ; W7 w# N4 E6 Q0 c0 w
  25. function RecursiveFolder($sHOME) {
    % {1 R  p1 i4 ]+ E
  26. global $BOMBED, $WIN;
    7 F# Z: ^6 o9 D1 A" y! @- i+ F+ P, z
  27. $win32 = ($WIN == 1) ? "\" : "/";0 y3 U9 R- D- g' v$ e
  28. $folder = dir($sHOME);: n( Z  u! V( h! A, a% b" R: }, O
  29. $foundfolders = array();
    ' ^+ ?  j, R# l2 d$ V" P6 I
  30. while ($file = $folder->read()) {
    ' U* c! K  g9 \+ M- t. g  p3 s
  31.   if($file != "." and $file != "..") {& C5 N& z" R( V/ i
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){; o0 x; ?' ~, V6 ^# ?! p! a1 `
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    4 @0 \+ _4 G+ I3 p5 r
  34.    } else {# K( W& w  B6 w: D/ N' b6 i
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    : U* C; z: ^4 ~' S) M
  36.     $BOM = SearchBOM($content);
    6 E4 ^3 D* ^+ S1 B0 Q' t  d, P
  37.     if ($BOM) {
    * Q- ]# a; G7 B4 Y) o2 ^2 o2 h
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;5 S2 k' o' q, g3 q& D
  39.      // 移出BOM信息
    5 H  X; l  g1 T8 s" n8 ^
  40.      $content = substr($content,3);# o0 j' c9 h" \. T1 _, Z
  41.      // 写回到原始文件$ [6 Z  n/ f( ~1 E: z' {2 X
  42.      file_put_contents($sHOME . $win32 . $file, $content);0 B+ b6 Q6 U5 i3 ]' _9 ]
  43.     }
    5 v5 l: @( ?$ u) w4 `& J
  44.    }& Q! k5 p7 y9 ^6 q
  45.   }
    3 e( I% z; v4 y6 G! h6 R
  46. }
      T/ U, |( X5 B" T" C; O/ Z
  47. $folder->close();0 p* i6 z) t( M" y4 Y& h0 C+ m3 d
  48. if(count($foundfolders) > 0) {
    ' B- F* H8 ^5 F$ }) K) T
  49.   foreach ($foundfolders as $folder) {, d( s1 c9 d( q7 i2 g3 V
  50.    RecursiveFolder($folder, $win32);+ G0 ^1 P+ k( H( ]: p6 L( N9 Z" H
  51.   }
    % n. N$ F' M, G
  52. }0 \$ {; R/ L0 t9 j1 D
  53. }4 c" ~% o( E: Z: C' T3 O9 U
  54. // 搜索当前文件是否有BOM
    5 N4 e- B( i1 l" Z& b$ k' l
  55. function SearchBOM($string) {
    8 R  S4 A0 P' ^: @& M0 k
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    / }" j) F4 I2 n) Y7 s: k: w
  57.   return false;
    . t. b3 P% i3 Q0 C
  58. }/ B" K, S0 L5 t
  59. ?>
    1 U$ [- K; m: ^
  60. </body>* ~' P6 S$ k3 w3 G0 [
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!5 [* O, G6 [' U# l% p1 t0 c6 N

3 l' F- s  H& ]7 R

本帖子中包含更多资源

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

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.