开启左侧

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

  [复制链接]
66598 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
/ g8 k: v8 P$ u% [: Z% T: y( _2 r% U& v/ U' ?
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
" L1 a, g5 ^) e4 S  {1 D/ {
. Q. I# b2 H0 a: I它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
0 P3 H. G# z5 I/ N
0 V3 C# M0 k, c7 k' R对于一般的文件,这样并不会产生什么麻烦。
5 o6 t7 X4 P2 H, q. {, q; c2 \/ M9 p! D
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。1 V9 C2 ]& e6 T# ]6 i' E
, V+ T( A4 B) U( f% M
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。% p. `, e: x+ c  m6 @7 X3 ~: E
* G4 \3 \4 j7 X! {
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!8 ]# X( T+ j5 V* l* f( B7 j" w) p) e

& ?% ~! @- y: N# ]: f. H3 E直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
0 X8 o" A5 \$ n( p9 }. j# H7 g1 J; t/ h3 y6 D
然而文件比较多,又想偷懒下,使用下列方法来实现。  ; H7 {, p# O$ y6 H/ l1 J

8 M& A# |. c1 t4 N) l将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换# `6 e6 ^, p! h0 h
, E& g6 }+ L$ U- v& f7 F

, Z5 \$ S) H7 H2 ]! V
  1. <?php
    , ?) r/ g7 Y1 M% ^
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)6 p' _  T' ]- `+ E; H+ K5 K6 p$ ~
  3. $HOME = dirname(__FILE__);
    # R! j3 D  a3 U! Q( W! F; f/ G
  4. // 如果是Windows系统,修改为:$WIN = 1;3 T8 A2 z* H; B+ x  k/ S, j# J
  5. $WIN = 0;( |- \; S2 h+ |' i% w( K( i8 Z% C
  6. ?>
    8 {3 }! z4 h: E9 l+ S7 R* O. O% n- y1 b
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">8 P1 E+ L+ j2 b9 q
  8. <html xmlns="http://www.w3.org/1999/xhtml">0 n( J; J2 |1 J/ t: G. _8 x
  9. <head># \# R: ^- C: \4 ^7 Z
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />1 X# }2 L# i  V( y
  11. <title>UTF8 BOM 清除器</title>" p  ?; ^9 N* Z' h/ I# ?
  12. <style>
    ) @4 X( A6 S( C, C1 C. |3 H
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    + ]' b# S1 j1 u6 C
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }3 ~1 d, i# w& i( f1 ]: E4 X
  15. </style>' z, X+ ]. t. `4 J7 \: ^+ ~
  16. </head>& L7 N/ \4 y1 i
  17. <body>
    7 _8 F/ d, A3 `0 ]! m
  18. <?php
    ' Q* j; r3 L9 ?" P" _
  19. $BOMBED = array();
    0 Z; Y9 N, ?0 o9 V! X
  20. RecursiveFolder($HOME);
    0 e* s+ M3 ]' Z4 _$ h8 U
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';7 ~; @6 c( b( d! d/ Y7 e, e
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    6 s% p" d3 H$ }& R7 b  V' ?( {' p8 m
  23. echo '</p>';0 h1 }1 w/ V2 ]7 }; M
  24. // 递归扫描1 E6 b7 f. @) ^( C2 E: z
  25. function RecursiveFolder($sHOME) {! d1 x* `. Z9 v4 i; S
  26. global $BOMBED, $WIN;4 r+ R. B; D4 w$ D6 g; [4 N
  27. $win32 = ($WIN == 1) ? "\" : "/";2 T; N' B# k2 Z) f, h% J, h
  28. $folder = dir($sHOME);
    / q+ {* Q) W8 s" |( b$ a
  29. $foundfolders = array();
    & J' \) n, i; i$ s' S; x
  30. while ($file = $folder->read()) {0 y/ d$ h  S( q- r! s, m6 d. |
  31.   if($file != "." and $file != "..") {
    + d1 R% J& j7 [8 }3 [
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    3 E! i4 y6 |# V) V8 V
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;0 n  u; `" O! i* a# `2 r
  34.    } else {
    / W) I9 m" p, @
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    / n9 G( W( b+ x/ D+ E) y0 @: C
  36.     $BOM = SearchBOM($content);
    ; b/ E5 l! @: n) ?; `* c) C2 ]
  37.     if ($BOM) {
    ' p' {1 A" G0 _/ f
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;* p  z" p; x% P0 M
  39.      // 移出BOM信息' v* v" }% p7 Z+ u
  40.      $content = substr($content,3);
    - l, V8 [. l+ @$ ~$ c8 J
  41.      // 写回到原始文件
      ^+ q6 Z8 C. x' w- f, I& R
  42.      file_put_contents($sHOME . $win32 . $file, $content);0 |* g1 z9 c! c3 {& z) \
  43.     }# j5 ]# ^+ D6 N1 ~9 n. j4 t
  44.    }$ H, W' s4 a; w3 L2 @6 k  {2 ^
  45.   }6 m3 J. u! b- y7 {& }/ G
  46. }5 l" K2 j- x# f- D( Y$ E+ J2 w
  47. $folder->close();8 E: k+ A4 j0 X% ]& w
  48. if(count($foundfolders) > 0) {0 [6 h2 |- _% i* p; v) N
  49.   foreach ($foundfolders as $folder) {
    ' Z+ @- F* A( s! w$ f% ^2 p
  50.    RecursiveFolder($folder, $win32);$ O' M* a# G) J: s: f1 ~' \: d
  51.   }
    . O0 J* p2 g, _6 f! K: P6 s
  52. }4 {& ~& _! S( s4 ~* Y0 o
  53. }' ?) u* }9 x  T7 P7 T& ]
  54. // 搜索当前文件是否有BOM& Y4 a+ H$ Z6 f6 @9 q
  55. function SearchBOM($string) {
    1 Q0 J; z6 t, y( e2 a
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;7 W/ O8 r& ^! c" G0 ^* }
  57.   return false;
      \. K" b# c9 q. \& Z: V
  58. }  [8 g+ a# C2 O/ M5 Z
  59. ?>: b$ b6 F2 i" O, M8 I+ S
  60. </body>+ F, M  p7 |: o, v! T+ E+ e
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!' {  r" T2 f" l! v# N, y4 i
  i8 ^* T2 F6 _3 I4 `

本帖子中包含更多资源

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

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.