开启左侧

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

  [复制链接]
66946 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。    A2 o; f' ^: E/ W" e

' Z, H' r5 w, M, O3 P这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
7 \/ v4 @0 p9 y2 T+ g* k; f* k4 p+ p! V/ a2 Y9 ~
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。& L; t+ ?# K! K' j: y7 W1 R: }7 y

0 C% H4 t6 o7 j  @  v- F6 X* M7 Q对于一般的文件,这样并不会产生什么麻烦。
: U. p9 E+ W# w, y% r" g0 E1 b$ Q9 f2 R% b: C) G; ^( ~4 a- l; |
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。! d% k2 }) R% E. P2 c- z

( F  Z2 s. r1 J8 k, U$ _/ J9 }5 d" d根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。# l6 i2 ^6 {1 q7 g2 R) x9 \: n
; E: b# X' l+ q" F/ R" t" A% O
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!4 N. z( O: _# |* f+ A' }

& B2 c" \! l2 m9 J0 q0 Y, a5 n直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   / s) V& l+ E4 R% S: U8 b
- z1 p( h" @9 f1 l
然而文件比较多,又想偷懒下,使用下列方法来实现。  . u* u# r6 r1 [

' H, Q7 A) [: ~, R4 `. J* Q将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换5 z  u3 C2 V/ f; [5 z1 K( S! L
2 ], x! W, x- l% g- c& h
- ^( L3 T0 j& a, y6 F0 \6 ~
  1. <?php
    1 [8 u2 O2 q6 Z" v  K
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    ( G- v& V( U/ @$ G' U
  3. $HOME = dirname(__FILE__);
    - O  v  c% T- ]7 W
  4. // 如果是Windows系统,修改为:$WIN = 1;$ G. c) _. m4 C* }2 j( Z
  5. $WIN = 0;6 u. R9 b# c( ^* q9 w9 S1 a1 O
  6. ?>
    : n- d) I5 w1 y" y: Y* z$ ]
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">, A3 S4 @' |6 m7 i* F; r
  8. <html xmlns="http://www.w3.org/1999/xhtml">* f) W5 T7 _1 v) O
  9. <head>
    % y( k. \4 R( y
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    / \; y( X" o9 R+ z2 \* W. w' a, G1 S
  11. <title>UTF8 BOM 清除器</title>" X( x$ l. R7 {+ \9 g2 s
  12. <style>
    1 z& i" f/ p$ o
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    + W5 o  ?3 Q& `" S# K' H4 g
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }  H* U! b+ v0 L! P
  15. </style>
    ! E2 K7 e8 z! \* h, y
  16. </head>
    - z  `2 F3 d9 X- a
  17. <body>
      f; K& _% @' v
  18. <?php
    ( N9 ]4 w6 M/ x7 j
  19. $BOMBED = array();
    . z4 P. L: @# `$ n# Z7 @. I
  20. RecursiveFolder($HOME);4 L1 {9 Q( ^7 r) c9 _' f! S
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';' b5 j7 K4 J* z) f8 i0 G3 A
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }- m- _% d, M4 D; F/ M+ [/ f
  23. echo '</p>';
    3 ~' _- ?; C$ A' E
  24. // 递归扫描
    2 T; H  r& q, d" w7 v
  25. function RecursiveFolder($sHOME) {
    1 t8 t1 z9 }0 J, a" d
  26. global $BOMBED, $WIN;5 Q( b1 B% M2 \. x: J2 ^
  27. $win32 = ($WIN == 1) ? "\" : "/";0 K) g6 C. b8 E( a; q5 I
  28. $folder = dir($sHOME);4 {0 J- o/ V% F/ h' |6 H5 g
  29. $foundfolders = array();. G% K5 a# a& L# n) G2 i+ X& Y, z
  30. while ($file = $folder->read()) {) u( c+ l2 P, t7 n( Q* E
  31.   if($file != "." and $file != "..") {
    0 p/ @% m- Y- F- e& N8 |
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){" @2 C' r/ d; {4 E, Q7 \9 r6 [' Z
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;+ |: r  J, S& L
  34.    } else {/ f: S+ A+ |6 R% @7 x
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ( _/ B0 M' G+ x0 F
  36.     $BOM = SearchBOM($content);: |" k& ~9 h# N  K8 ]
  37.     if ($BOM) {
    3 s+ X; \1 {# Y' s' }
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    7 l3 W/ d9 j9 J2 B4 n4 C; U# E
  39.      // 移出BOM信息  J8 }. v1 e0 a1 ^
  40.      $content = substr($content,3);
    6 B0 l# L% P, U- l+ Z0 N3 x5 R
  41.      // 写回到原始文件
    0 a$ m$ q( I: ~- q& g2 S
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    8 w9 i* |; _. w& v' q" t+ e
  43.     }
    - p7 I4 Z. l6 @" K/ U
  44.    }( b( `& k4 U8 H, v$ g
  45.   }
    / k" h' S7 r6 r4 [( n0 y! z# w5 H
  46. }
    : X' S2 u# v0 Z) J
  47. $folder->close();
    & m5 R) z1 ]8 @
  48. if(count($foundfolders) > 0) {
    & `: L7 `, k% e' C2 ?7 ]( L" \
  49.   foreach ($foundfolders as $folder) {7 ~' V  {+ n- C* B8 R
  50.    RecursiveFolder($folder, $win32);% D, _( \" N& w9 o- D) `6 a& D
  51.   }1 O, i' C- `9 ], i, i; \
  52. }8 E" p5 ?4 K  T; [$ }% h" `
  53. }1 ~/ Q, T) v' \+ v; R4 d: ~4 b% l% r' ^. R
  54. // 搜索当前文件是否有BOM# Y* `$ E' B+ @* t
  55. function SearchBOM($string) { $ ?3 x  R: W+ ~! U  `5 S
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    : x! k* L, H4 f' Q- ~
  57.   return false; ; _& G* |! Z9 K( s$ S' o& F
  58. }+ _% @- @; u* M$ y5 k
  59. ?>
    - N9 X5 [8 Y4 ~' n7 s0 o4 i# ~$ Q
  60. </body>
    " v' L3 y1 S6 J# @: x6 N! h
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!9 p/ L$ T7 K. N+ O: ?$ I- j# M
. n) Z% O" g4 M

本帖子中包含更多资源

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

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.