开启左侧

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

  [复制链接]
66587 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
+ j$ v$ @9 J& E5 v) U
" m# }0 k" B9 s0 \1 z这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
) L# U2 ]4 Z  x" H' z
. j5 S# L0 G7 S" X- y4 ?它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ [8 t, F0 ~" @1 u7 x8 t" ~
  I* y% l3 g) z- p: G' e* c对于一般的文件,这样并不会产生什么麻烦。
" Q7 |$ Z5 ]; E! b0 d) |& V
$ }3 e7 z( V* E" ^2 {9 O1 w: {但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
0 q. g6 P9 R! ~8 r/ b5 F! u  l* @6 Y* L
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。* n: J3 B% r+ ^9 w

$ w7 B" D8 f4 [1 N1 g3 l4 h3 h由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
+ }  y: f" o, x. \/ C: V) A
' \; U$ ^7 X1 O) C9 c/ `直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
1 z8 |% s. v( {" z
! W9 f3 q( h( H8 e" \; Z然而文件比较多,又想偷懒下,使用下列方法来实现。  
5 p# e) c& R: q8 s  k2 V  n6 E8 [0 M. ]$ i$ P/ N/ W
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
4 T% k$ ], T4 b3 _- Q, |8 p  p& x4 j4 `

1 W. }4 o' m- y' C5 S
  1. <?php 5 v: j2 N+ e% C3 D
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    % S, Q% y$ e9 Z/ X
  3. $HOME = dirname(__FILE__);2 g' p; v+ |) u
  4. // 如果是Windows系统,修改为:$WIN = 1;
    % p7 t) I: h, N
  5. $WIN = 0;
    8 w& k" q3 p: n+ y% T
  6. ?>* s6 J* r) x: j
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">8 @; P& V5 o; c0 R$ {
  8. <html xmlns="http://www.w3.org/1999/xhtml">, n& H4 i2 b" _, _/ l. c
  9. <head>
    1 m2 w' h0 y! r7 o/ E) T
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ( ?, s* u% F" B% k
  11. <title>UTF8 BOM 清除器</title>% c" _: F) Q5 `
  12. <style>! \8 _, Q* I6 V1 \* s. i
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    7 q5 e  Z! F9 \! A+ O
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }0 H! P* X4 b$ @5 T
  15. </style>
    3 N4 |, m$ Q7 Z8 j" _
  16. </head>
    5 v. Z; n0 J  _
  17. <body>
    , H, D. ~: L* Q0 W: t5 p, y, O
  18. <?php
    " _7 B# K/ W; Z
  19. $BOMBED = array();1 ^! v( z1 R9 x' ~  q
  20. RecursiveFolder($HOME);
    . l; ?) g' I7 y4 r0 J- }3 M2 p
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';" K0 W; }% ^# v
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    , C" _+ u6 \* O. N6 ]+ i! \! X
  23. echo '</p>';& J$ m) e0 e/ l2 y
  24. // 递归扫描. b  p% n5 ]8 K0 N+ L
  25. function RecursiveFolder($sHOME) {: @( o, G0 L, a+ K5 [9 v
  26. global $BOMBED, $WIN;
    9 |* j) f% z+ q6 ~+ M0 x
  27. $win32 = ($WIN == 1) ? "\" : "/";
    5 x" f; B+ j$ ?& v3 _  `: T
  28. $folder = dir($sHOME);
    2 a2 J# K' A" }
  29. $foundfolders = array();  X3 I# |% ]/ L, h, m6 z6 ~
  30. while ($file = $folder->read()) {
    & `' C8 [$ E% T3 i5 H, z7 S2 V0 P
  31.   if($file != "." and $file != "..") {
    & b* }& ~" m* P' j0 j
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    ( {5 {- _& ~. i8 Z
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;7 w) K" j- D! d' D
  34.    } else {
    : n4 J5 s7 z" l  K. Q
  35.     $content = file_get_contents($sHOME . $win32 . $file);4 f  z- r: z' U  e
  36.     $BOM = SearchBOM($content);
    4 z" }* F. ]" U) R/ E9 m5 I
  37.     if ($BOM) {( b/ p$ d) C* n$ Z8 ~( W4 X
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;9 x/ o3 G. p4 @
  39.      // 移出BOM信息* V7 g- P& B% r) K  v! R
  40.      $content = substr($content,3);
    ' ~' e' U( L6 ^) ], q$ d
  41.      // 写回到原始文件8 T; x3 \6 \2 d
  42.      file_put_contents($sHOME . $win32 . $file, $content);1 \  C1 ]2 Q( c/ P  |
  43.     }! q7 \$ W* |/ _
  44.    }
    . Y" l& W: O+ _" u' t
  45.   }% I* R; g, C1 q9 d
  46. }
    1 ^! w" R4 Y0 y2 b6 z+ J9 `1 ^/ X
  47. $folder->close();1 l( a7 @5 H6 q* u: l+ x9 x
  48. if(count($foundfolders) > 0) {/ d% ~. h* u3 E% e- s3 A/ S
  49.   foreach ($foundfolders as $folder) {, k% t0 q+ U* B- e
  50.    RecursiveFolder($folder, $win32);
    2 L" a) f" q, N, ~0 w5 C
  51.   }
    6 j5 E( a) M/ r: r+ `- L+ m
  52. }
    7 i9 t0 l7 e1 C+ i/ Y+ W) ~. \  J
  53. }
    6 n, {9 {; r) A) x* H" f" R
  54. // 搜索当前文件是否有BOM: a" _, J" t: W8 h* \5 E
  55. function SearchBOM($string) {
    5 i4 l9 }' I1 W: W( \: @7 B. G
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    ; y: k, V. I& L3 R3 t
  57.   return false;
    ( E+ n& }% L% p% ]6 P) G* K
  58. }
    # @  ~9 i; @$ b1 [
  59. ?>: p) |7 f% _4 l
  60. </body>: u9 [5 N- V9 e
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!, I6 T5 t# |: w3 s% N/ M# a

* ?3 w5 T  d9 B& ?  d3 Y+ T: _5 s

本帖子中包含更多资源

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

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.