开启左侧

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

  [复制链接]
58995 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  + Z* C+ P: g) Y
' D9 G. y9 {; Q- s4 B+ s
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。* a# T6 C( n" L4 P; B' [! P

3 y4 Q1 A1 W1 M: F1 q: y1 m它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。+ K' c  k5 w0 `! g
: J! U( G% P! }9 X, T- k
对于一般的文件,这样并不会产生什么麻烦。
; H' X4 b! [7 W# j. w  `9 m+ \* x* p' p
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。/ r4 h3 p4 y5 l4 T
2 r( \4 M% }4 N
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。) n. H) s: ^' h, D0 Y
1 ~7 Y7 f; _; @4 Z9 i9 ~
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
" c. O1 r6 L8 k$ X7 l+ i0 \. x' S  d/ R2 D1 Z  Q
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
  S1 o. ?$ Y8 {5 A! a! S2 X& T! Q% v% A8 R
然而文件比较多,又想偷懒下,使用下列方法来实现。  
8 U; n' V9 f/ P. X
! O- z8 S5 g  E) z! _9 x将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换) q, [# d/ V! F$ E$ [4 v4 Z

1 L/ E$ U! F1 d: Y- K6 f  S4 M6 H5 Y! B6 Z% N# @
  1. <?php
    : f& J+ J7 R  }9 |' I, A8 v9 ~% [1 m6 D
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    1 z0 T4 V+ T3 F( K/ b$ o' G
  3. $HOME = dirname(__FILE__);
    ; f9 ]) n6 m% ?
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ' x' ~! @6 N# r' O0 {' r
  5. $WIN = 0;, O. w( E7 G; I$ u2 [
  6. ?>5 k+ {8 K$ i! o2 ^- d) f% x  J
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">- n$ l5 S  c# y
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ; z+ M& @  h* ?! P. X
  9. <head>
    / j7 Q) x1 U7 Q! F7 L# [% a
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />/ Q4 s$ s& M7 p" l
  11. <title>UTF8 BOM 清除器</title>3 Q& z# Z: P9 _6 u
  12. <style>  X. g: J: E: C0 [
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ! I5 J3 a! c+ B* d% \
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }6 q1 Z' F/ q  W
  15. </style>5 _) I0 E; _7 O/ o4 M4 _
  16. </head>
    + j3 [) a  r/ U& N: ]! A6 }
  17. <body>6 j' u" y% I  {6 h# l5 K1 {7 U5 m
  18. <?php
    & O1 J( D2 A7 `; H1 f! U6 h) s
  19. $BOMBED = array();  n9 l+ r1 e4 q8 v7 ?# |4 N9 s/ \6 Q
  20. RecursiveFolder($HOME);
    1 o! b, n  V8 N5 M% B
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ) V+ e# f9 |0 j4 V. |
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }4 w! }) J" j" W
  23. echo '</p>';
    . T7 W6 r: S$ K* r, g, q# b
  24. // 递归扫描. {6 ^( }" u0 N3 a4 H
  25. function RecursiveFolder($sHOME) {* Q) ~9 s9 ?4 r: M+ V1 [% L
  26. global $BOMBED, $WIN;8 }3 z3 u. J7 L& A) y% a. a
  27. $win32 = ($WIN == 1) ? "\" : "/";
    3 Y  q- p9 O5 X
  28. $folder = dir($sHOME);) Y$ v- \, Y7 ]
  29. $foundfolders = array();* Q- F, {6 F0 v# K2 a5 x, {4 A, G
  30. while ($file = $folder->read()) {& s2 g  n' E' _8 }
  31.   if($file != "." and $file != "..") {
    3 F8 ]- Z3 ?# \. Y
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
      J* n$ c; a% t2 @
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    5 C* H5 x7 K, k8 c  `
  34.    } else {
    - ]' d" U  b. h6 o& \3 D' e% _3 a
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    7 s* P5 E1 |$ J' W: d2 ?- w6 O5 d
  36.     $BOM = SearchBOM($content);, V$ K8 i  r7 T5 ^5 m
  37.     if ($BOM) {2 ^* ]9 J1 n1 v! i2 I8 g2 v, [$ `
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    ' u2 B) H6 L+ R" E! p$ _( G' @7 i
  39.      // 移出BOM信息! N1 Z' A' `2 v5 J) b4 M
  40.      $content = substr($content,3);
    # d& W0 t7 J6 D" j9 a7 H7 k
  41.      // 写回到原始文件, e/ O+ d* V7 n
  42.      file_put_contents($sHOME . $win32 . $file, $content);  V9 T+ ?! W9 }7 [
  43.     }/ x" l& @2 u+ ~) ~  m) g
  44.    }' @- }0 @$ A, M/ e) c/ \6 b
  45.   }
    $ Z$ F/ b6 G' [
  46. }
    0 \7 y8 [* E' L( [: Y1 W! Y. T$ i2 A+ T
  47. $folder->close();
    ; @- K$ N% y; @
  48. if(count($foundfolders) > 0) {6 n2 ]9 u3 F' p' h2 g
  49.   foreach ($foundfolders as $folder) {* P3 T$ t1 t5 j5 r" O
  50.    RecursiveFolder($folder, $win32);
    3 G6 z: U2 I" R; i( b
  51.   }/ i2 z$ E  s! Y/ `4 \  @
  52. }
    1 @( q  h) ~( ]! f( ?( Y/ J
  53. }% }) }. E5 w6 z1 }
  54. // 搜索当前文件是否有BOM" K. }  G5 I+ Z- Y& _& J
  55. function SearchBOM($string) {
    * x) d, N7 w5 l# f4 v8 M2 G
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 o1 J7 B3 C7 `- S" u
  57.   return false; * z0 u8 U) L$ g9 m. e
  58. }
    ! l/ @9 z: Z) [% G  }. W# v+ V4 C
  59. ?>
    1 o# L2 N3 r  @% i) V
  60. </body>
    ' s2 P4 s' l7 {" w6 H6 T+ K
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!1 S4 D! D  H( m0 F$ q; V

5 B, I, I4 N" x, {% g

本帖子中包含更多资源

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

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.