开启左侧

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

  [复制链接]
67363 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
, H7 R$ @( L4 P9 K& L/ L, q/ X* u4 \! I0 u4 S% B
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。. _7 j" _' @! P1 j( F* D# g4 N
- [9 ]# Z) F) o7 W# u4 k& N7 {1 P
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。6 H& V5 N7 T& x; F$ c! x
5 Z2 d( H' |3 p# D( u8 ^
对于一般的文件,这样并不会产生什么麻烦。
2 v  \# ]2 b0 e8 I9 [0 [* D6 t# l1 ~' B/ |
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。- }- c4 y5 X* h# ^3 B* S

6 d; x2 `+ R+ a! ^根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 q  c4 {$ l2 j* W/ a- O

* H; D8 I: C. X, p- D6 \: x+ k" p由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
6 o6 i- N: u/ h5 ~9 Z5 p. h. i& r9 L; x" K
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   % [! r# H" @& [6 \5 ?

. r9 I2 ?5 o$ V" c4 b然而文件比较多,又想偷懒下,使用下列方法来实现。  # z: m$ g: A  \

! b% `- N( N% s8 a$ D% p2 e将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
, y  g4 e, U( {3 L" R  p1 Y4 ?
' @- q7 W+ j) ~7 Q7 }* \
3 g" }8 |! U2 [: I: K
  1. <?php 3 s9 q0 ]! s" R5 u: B
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    , C$ ^5 h0 x8 C
  3. $HOME = dirname(__FILE__);& A) Z; E, ]! {( W: N. D! ~
  4. // 如果是Windows系统,修改为:$WIN = 1;
    0 A# T- r! }& R8 K- w! I
  5. $WIN = 0;% c( x6 G9 Q7 a* w+ \  U2 L+ z
  6. ?>5 v& |; ~9 \  k  N# z! Y+ _. n
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2 a8 G4 g0 L6 i8 n) g) j
  8. <html xmlns="http://www.w3.org/1999/xhtml">$ x5 I! E3 m/ A% {' N5 F% K
  9. <head>1 s0 X( t7 h: Z0 t" G
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />( F9 w7 {. q$ x; _4 z+ I
  11. <title>UTF8 BOM 清除器</title>: X1 L/ _( N& F0 m. K
  12. <style>
    , P7 a8 S  f" n' z
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    * X* P9 p9 R( E. |1 w  [
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }# `; B: J% h7 V, E! k' M% c! x3 O
  15. </style>
    0 g4 o) j6 G2 M6 u6 U8 h
  16. </head>. {! U: E: ^/ p4 }" Q! e
  17. <body>  P2 @( F; _9 K( T$ b
  18. <?php
    " {9 Y1 Y" \1 D8 E
  19. $BOMBED = array();/ i5 R, w. B( l3 \+ V1 m' F" N
  20. RecursiveFolder($HOME);
    ( A& ^7 a( P8 c/ `
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    5 b  Z* q" O0 n# L) X
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }7 F" g# B- N( d/ `' P
  23. echo '</p>';
    ; V" ~$ X1 v* @7 ?' C6 h5 y
  24. // 递归扫描
    ; z) b, d) d. \; L
  25. function RecursiveFolder($sHOME) {( V# J+ z, N0 Y  Z; i, B) i
  26. global $BOMBED, $WIN;. |7 q+ O, Q4 L. l# K8 O
  27. $win32 = ($WIN == 1) ? "\" : "/";' M) J9 Z( q+ o7 i: ?
  28. $folder = dir($sHOME);
    0 f' ^9 }& C, Q( V3 p: @
  29. $foundfolders = array();) {. E( M/ M% t% W2 d, L  k
  30. while ($file = $folder->read()) {* k2 W  F3 o, o0 ~, s* P
  31.   if($file != "." and $file != "..") {
    / r: G- e2 O& G  I1 D4 `: g
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){) ]. c, ^- l, Y2 t, a" ^; L
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
      v# O' O9 j& {
  34.    } else {
      Q% f5 w: a' u+ X/ F
  35.     $content = file_get_contents($sHOME . $win32 . $file);  _  C0 e9 q: S/ c2 ^
  36.     $BOM = SearchBOM($content);0 s& Y2 g- m4 J7 d! c) h( ?8 j
  37.     if ($BOM) {
    3 I+ `4 {% I7 @2 M' M) U" l5 |
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    ! _0 `) v! l* Q; p
  39.      // 移出BOM信息7 Y  l0 d' M) e& C! \" o
  40.      $content = substr($content,3);! q" w& E% Y3 P! B" n* l1 L/ B2 M+ P
  41.      // 写回到原始文件
    # k# F; H1 z" y' d
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    3 T8 B0 K' S6 _% C" R2 F: G
  43.     }' M1 a1 G4 d7 M1 H! _
  44.    }
    . L: \9 L9 x: c1 E$ }
  45.   }
    : p2 P4 W* D! s7 X, U" Q
  46. }
    # I. B6 d/ i$ @- F
  47. $folder->close();# Z# |" I0 L' d) L
  48. if(count($foundfolders) > 0) {( |1 D4 M+ h6 u, r( d. ?6 n+ c9 q, ^. [6 Q
  49.   foreach ($foundfolders as $folder) {5 F$ Q' l+ e3 D3 F& F; e& \
  50.    RecursiveFolder($folder, $win32);
    ' a( H) p- l% \% i/ b' v0 e
  51.   }3 Y2 S6 ]" @8 s1 {# p$ a
  52. }
    & {" ?0 G6 Z) S
  53. }
      K% ?4 {: }2 s, ?6 ]
  54. // 搜索当前文件是否有BOM) i" N9 Y5 L3 u9 E! o
  55. function SearchBOM($string) { 7 h2 ?4 r& i6 B7 Q. S7 y( F9 s2 d
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    ! t, _* E5 m, |. A/ ?- {0 B
  57.   return false;
    * O. _9 k+ A4 b
  58. }  u% |/ ~' h( P( H7 C8 v
  59. ?>$ f2 h' h' F* H- L9 T; Z) q5 n
  60. </body>) V+ V; n+ l) ?3 B( i
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
, _; n; a  x) s0 Z! E7 v3 s; J' [1 ~, V9 d4 r  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.