开启左侧

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

  [复制链接]
66024 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
- R' t  a$ K' |' q+ |! L( Y
$ V  M+ [  s  G1 t$ Z  y' w这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
" {- e9 V. ?1 C4 W
$ G1 Y, P! q$ h, n* N5 V% V5 [: _它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。- `2 K; A, o, }) ]
" Q6 ?: e; H2 E' X3 ]& d
对于一般的文件,这样并不会产生什么麻烦。
" p4 ]7 W8 _- c5 I8 q$ G: I# f! \" ~. l4 @% j% z+ q9 t- P) L
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
0 ^* Z1 {; D! T
9 f- h( X: k8 {根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
8 F+ P* r" A; G+ j0 \% T" a' R) r  C2 v# o; Q! x7 L5 U
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!8 `% _& k$ S" W  C: {) _

2 Z3 M4 a, J6 ~直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
9 `* f0 R* s0 ]5 Y) ?- ^! t2 K. ^( |" ~6 ]( ^" i# N( R+ @% V
然而文件比较多,又想偷懒下,使用下列方法来实现。  " X  h( _: G$ `; l

, F' j9 y0 a( G$ V6 j将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
& {( T5 {* ^; O& f+ r* s# Q# p7 Z. Y, E- B2 p8 H/ D
( Y3 i+ F! L! I3 c
  1. <?php . E3 I" g( a$ ~5 ^8 @/ s) r$ v
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)& _, y7 c' t2 o6 P/ i, k
  3. $HOME = dirname(__FILE__);
    9 e  N8 S4 X. D3 ^
  4. // 如果是Windows系统,修改为:$WIN = 1;1 u9 f: K0 C5 w5 f8 g
  5. $WIN = 0;$ \5 N, N- v) E- R5 F  ~8 n: \
  6. ?>
    ! ~; q0 P' w1 X* \$ x1 t& t" y
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">& f3 d- N/ \! u, ~* Y7 o0 F* W) N1 j
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    1 b: A6 A+ r. s) U  Q
  9. <head>% [& j( h: G: r# W% Q* p1 l- T
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />9 Q; s2 U) t  V# g
  11. <title>UTF8 BOM 清除器</title>) k. g; i/ D, y. {9 X1 S
  12. <style>
      Z$ @6 Q; d5 D+ i( e
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    * `6 f! E% V  q. S5 V
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }: I4 L* z. ?6 J/ S
  15. </style>* P  u5 A% O4 s" w
  16. </head>
    ! ?4 ^; d% H. o" Y
  17. <body>  h2 w- N; ^  P& O) D# x' E
  18. <?php) L: ~% o$ ?8 L# n
  19. $BOMBED = array();
    7 h3 p3 f. }9 u7 F/ ^" n; O9 c
  20. RecursiveFolder($HOME);
    3 k  |6 z( e( ~* o
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';# y: p% g; `0 Z
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }6 i3 X# z: L$ e; E6 O" G# _
  23. echo '</p>';
    * U! B. x# V/ B
  24. // 递归扫描  w+ L  T7 V* w( A- F9 _! R$ z
  25. function RecursiveFolder($sHOME) {
    $ x6 g- L2 i6 v' Q) q4 T
  26. global $BOMBED, $WIN;
    : v0 H. d% c& a( {1 N
  27. $win32 = ($WIN == 1) ? "\" : "/";
    . z3 f6 g3 A( h5 @& A8 B  c
  28. $folder = dir($sHOME);
    3 L# c; i, a' }! W$ ^4 V
  29. $foundfolders = array();6 Q$ m( R5 M. J& _9 m( c9 a
  30. while ($file = $folder->read()) {0 Q4 i: @! Z6 J
  31.   if($file != "." and $file != "..") {
    / b6 ]- t& K& D
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    $ d: x) J- x4 T. p5 @1 I
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    0 L7 H; |/ G" w- Q- g3 R
  34.    } else {
    / k3 h2 Q) J7 ~1 o8 e, ]- w* h" E; `
  35.     $content = file_get_contents($sHOME . $win32 . $file);% o# H3 z6 h' {) ]& q. ^
  36.     $BOM = SearchBOM($content);
    1 H; E  g! E! J
  37.     if ($BOM) {
      y8 Z' |4 j# N1 ^! t
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    5 b' v# `8 P: p4 h& N
  39.      // 移出BOM信息5 z4 r( Q4 M2 G% u
  40.      $content = substr($content,3);
    + m- h; Y* w7 `1 e- D' G7 o  @
  41.      // 写回到原始文件3 x& Z' g3 I/ H( k- I5 q+ J
  42.      file_put_contents($sHOME . $win32 . $file, $content);) U* O' @  u2 Z5 P- g
  43.     }9 N  j# y( p* B: G6 F7 P
  44.    }3 A4 W  |- O1 C; ~$ q
  45.   }0 n3 h" \! m& z/ ?7 T
  46. }
    # M; p2 S6 n  R  v1 V' G) e
  47. $folder->close();
    - b/ ]( b  K: j* R" Q, Z7 g. d$ [1 a- K
  48. if(count($foundfolders) > 0) {
    9 I9 w' f( y5 l' s0 J- q7 j
  49.   foreach ($foundfolders as $folder) {
    0 B0 M2 |% }( b; {0 p$ u; K3 m
  50.    RecursiveFolder($folder, $win32);) P' Z- G% _1 a: n
  51.   }
    # n& T+ [# C5 |; M
  52. }
    ( N# i1 z1 a8 y1 F: m! O
  53. }2 e8 q' S. }: Y; D, e  E. w7 E: q
  54. // 搜索当前文件是否有BOM
    # D3 y* P: I! L& y: _& \
  55. function SearchBOM($string) {
    ! W1 u# W3 x0 N" _+ o6 l
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;- ~' [. E) X! R  _8 f& e9 m
  57.   return false; " v- O+ Y6 q; i# E* s, n
  58. }) C7 C( X, f0 L  T3 Y- w
  59. ?>
    . N4 u: o* {9 L0 W( c6 R
  60. </body>
    8 j/ @- z" g! K: @7 j
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!; S0 ]; Y# ]+ M
, o. b0 m3 O% \

本帖子中包含更多资源

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

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.