开启左侧

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

  [复制链接]
64990 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
& N( R, M; D+ n2 y9 s
( ?) R4 }# C* J# v) S* d这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
. T- K: M/ J: `+ a( c/ }+ G6 R$ w% o% p# s5 o$ o# ^; d) h0 L
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。/ i! u6 a+ C: j* _1 k0 Q* S$ a
; j. z- ?+ }% X! }. e0 {1 ^
对于一般的文件,这样并不会产生什么麻烦。2 E3 N) j$ P% z% ~2 ?( z
  i4 o* x& x! {# O# q# Q. C- v
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。& E9 g8 }/ v) x5 G, d9 i, o
5 g" ]+ l* x, G4 r0 |
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
7 y3 ^8 b$ P9 @; o. k; H6 C( U
. H  \- E, ?! c0 j6 x  s3 _由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!4 n2 D5 W. `( H/ U

- ~; \# U8 t" W) {2 T4 i直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ( X; L# c- T4 R
! j' M0 j7 w/ ^+ S
然而文件比较多,又想偷懒下,使用下列方法来实现。  
$ p4 c* I4 ?$ A$ o4 G; |' m: m/ F1 ?! I
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换5 d" m  n2 i. L& f" @7 M
6 x1 A2 P4 P( m
3 T8 e6 k0 \/ C; c* G6 O/ h" {
  1. <?php
    % I& N0 w2 g3 y9 x! ]
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    ! S$ M4 W5 n6 A# |
  3. $HOME = dirname(__FILE__);3 L& \4 H2 [; k5 f9 V0 y
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ! V$ A- i. `+ X
  5. $WIN = 0;
    & G1 a' u& }# q+ X2 U1 i
  6. ?>! F. e% {; s9 Z$ I; F# ~  B$ S
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">; H% V5 j7 I& m, }
  8. <html xmlns="http://www.w3.org/1999/xhtml">. z' M  S6 @4 p. {8 S
  9. <head>
    3 s8 ]4 e/ K- e, y8 i# M- y( I
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />( M- G/ k8 g9 A) x- t7 G2 S( X% Y7 O
  11. <title>UTF8 BOM 清除器</title>
    ; \2 I. a1 [9 ~& M& f3 M6 n3 l
  12. <style>
    " Z9 K7 ]) g7 d
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    $ i& I1 U& ^( ^$ [% p9 Q6 i$ {
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }4 f$ k* c4 l/ ?! F
  15. </style>
    ) l( g: n5 S! D: D$ b& y/ @
  16. </head>0 T4 G( n8 p: |0 D1 V2 x( k
  17. <body>
    8 W! W  i2 I  a( U1 r6 z, O
  18. <?php
    9 _: B( a) |3 d% |3 o& a6 r" s. ]
  19. $BOMBED = array();3 }" V7 O) S, C' @& `: A% f
  20. RecursiveFolder($HOME);
    , i( l  b8 I9 w+ {
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    - h/ ?7 b! E( ~/ C! M
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    3 |' X7 J* e: O9 X
  23. echo '</p>';
    ! Y9 q; w9 Z5 N' m7 E0 [
  24. // 递归扫描
    - d+ p  c4 M( y7 g2 K
  25. function RecursiveFolder($sHOME) {0 V  D" V0 G2 Q/ S
  26. global $BOMBED, $WIN;
    7 I2 o" l* l# n3 c0 I
  27. $win32 = ($WIN == 1) ? "\" : "/";, R3 s- A7 c, e
  28. $folder = dir($sHOME);
      W, e+ U9 ]/ V( G+ g5 H1 f" R4 m
  29. $foundfolders = array();
    6 ]( S4 u7 q5 |; M5 c3 Y( t! z4 v& B, d
  30. while ($file = $folder->read()) {
    , V: D; B% b1 ]/ \* M( B
  31.   if($file != "." and $file != "..") {
    : }6 a, k- Q; ]: ^: U1 O; {+ Q  i& ]( ^
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    5 R3 i9 V+ v& h$ B; o( l9 B& i
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    " s* X9 \7 K5 ^7 N9 g9 b
  34.    } else {# S2 w/ z" Z9 T) @( e
  35.     $content = file_get_contents($sHOME . $win32 . $file);. S* h- L- {5 k, f; N% W& c8 m
  36.     $BOM = SearchBOM($content);( r5 s  I$ m( P! D6 [6 x
  37.     if ($BOM) {
    # O$ a' @: q1 s3 A" A5 T# Y2 b
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;7 T1 ^$ Z5 c" Y/ Y. q2 b4 x
  39.      // 移出BOM信息7 w" u# N& {% d0 z7 q  g
  40.      $content = substr($content,3);
    ! e- w; J3 C- `
  41.      // 写回到原始文件  `. Q( p0 @/ P. k5 c! W' q3 u
  42.      file_put_contents($sHOME . $win32 . $file, $content);" g( K+ q* G+ O
  43.     }$ \: q# z7 T' D  P
  44.    }
    . j& O8 k2 w+ ~$ N7 I. i. U2 v
  45.   }
    3 u. l7 {) H0 w3 ]6 w  s- ?& K# n
  46. }* p3 _: }2 j$ }& _* r, |8 N2 T# h
  47. $folder->close();3 j% x6 `" v! @7 `4 T1 o% W
  48. if(count($foundfolders) > 0) {/ v) A* V6 N  w
  49.   foreach ($foundfolders as $folder) {% S9 O, H" B  C% g
  50.    RecursiveFolder($folder, $win32);
    ) Y% J& ~" }- ]" Z/ w8 w
  51.   }
    ( ^) L; @: A+ @. G0 p
  52. }
    % P1 I3 _9 @% T: M$ z
  53. }$ f& a8 O' Z, x- z, |* J4 Q+ N
  54. // 搜索当前文件是否有BOM4 q* Y4 ]2 O0 ?: U9 {
  55. function SearchBOM($string) {
    & b0 K- c8 l  z! h
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    2 ~9 j& K8 l; Q7 L5 G! c
  57.   return false;
    # a: ?* a- |7 ~; }* U
  58. }  G/ W( g/ V) N& _
  59. ?>
    1 G9 c8 n/ b( _/ [
  60. </body>
    / m& b" V+ [& Q$ E# m  ^, F
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!$ ]( \; y( {" m+ `# Y  K4 w2 ^. @
; U1 X( p+ o" F$ @

本帖子中包含更多资源

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

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.