开启左侧

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

  [复制链接]
65170 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  / i1 @  E* P8 l- `4 N5 Y/ Q  D
3 N5 O8 P0 J) v: u4 M
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
+ a7 B* ^2 R# r9 ?* l# I
4 V1 j: x0 H" l+ s0 [' Q+ @+ b7 J( d它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
6 i6 c- l0 W( a4 X, Y. p
3 c( D/ {5 m8 T! i" y对于一般的文件,这样并不会产生什么麻烦。
: t, f4 S: w1 S. F) P. r6 f3 w8 v0 ~5 O* [" n+ r- G) E7 N+ d
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
6 l  n5 A1 D/ x& L4 y% F& F; [- k8 }8 k9 k9 D$ _/ c( Q) U
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
: ^! N- k9 v! _: a2 n0 n/ Y  W* l9 F, i0 r
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!# }0 W/ g" ?" Q6 K/ \

8 ~! j& M6 x: U6 V# U直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
8 J$ ^. y8 A1 U6 s0 J5 Y( E4 j; R; \% r8 Z
然而文件比较多,又想偷懒下,使用下列方法来实现。  ; n) w/ ^2 X8 \
$ [5 c1 Z2 J+ w6 n
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换/ O+ V. c, i% v" c1 a. u0 I

) e6 z1 Z- J) n! ~. J6 W9 u+ I; H5 h4 N7 p8 z2 ~3 s5 s1 a. x, g
  1. <?php
    " X4 N5 O/ I- o4 |% Y: z
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    ; i: _) L/ s* d! @1 q
  3. $HOME = dirname(__FILE__);8 @7 D+ o( Q1 l3 `9 I
  4. // 如果是Windows系统,修改为:$WIN = 1;+ ^  H% ]* s* F3 G; a7 n7 K% o; X8 n
  5. $WIN = 0;, [! m7 l8 z1 N
  6. ?>
    # I5 a, x- R# V
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    ( _) m6 j2 \+ k: A* F& W- X
  8. <html xmlns="http://www.w3.org/1999/xhtml">( N  h4 z' _3 L( B/ |7 Y
  9. <head>/ z1 H! i- T' S+ q  k
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    1 Q" o4 O7 q4 _5 K
  11. <title>UTF8 BOM 清除器</title>7 n6 t4 C. q- Q( _" V1 l
  12. <style>0 ?" t$ [3 Z, l7 }5 [4 B3 |
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }2 `: w) q2 Y$ }0 w" n% v
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }) X# A- I# o9 b3 f2 N
  15. </style>
    ; ~; l* d5 v2 C+ ?
  16. </head>7 R/ p& v2 ?3 j) `4 o
  17. <body>" N8 q9 J, N6 W; G( R& N
  18. <?php5 _4 U9 V2 i& t( K: R
  19. $BOMBED = array();
    ) H1 _/ h7 H( \5 ^
  20. RecursiveFolder($HOME);
    1 p8 }% L! r6 f1 k
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';) L- u" }1 G6 G" X3 t7 ~0 u! M1 S
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }: G& r" R6 V  }6 P7 p# {8 B1 f
  23. echo '</p>';( _6 i+ t" G0 Y& R3 W
  24. // 递归扫描* T/ j( B" E/ d* V4 ?& S5 {# d
  25. function RecursiveFolder($sHOME) {
    : k1 ?6 `: o; E7 b# X+ v
  26. global $BOMBED, $WIN;: p% Z. @8 g1 C. a
  27. $win32 = ($WIN == 1) ? "\" : "/";7 p. n( @- z' d8 x! _
  28. $folder = dir($sHOME);
    : P, Q- e5 o4 U7 K, h: ~
  29. $foundfolders = array();/ c8 H7 V  B* O5 j- t; }! u
  30. while ($file = $folder->read()) {3 Z" L& g4 ^% T# l0 C1 E4 T
  31.   if($file != "." and $file != "..") {7 W; E, n4 h+ O5 D2 }
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){/ W, b6 K) F2 k) ?5 u+ f
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;9 c) W. f) r7 I" |  a# M
  34.    } else {. B+ K0 u3 ~( q2 d$ L7 ^: V
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    1 l. Z8 \* |9 s
  36.     $BOM = SearchBOM($content);' @5 a% C" z  k$ a% |! Y) B
  37.     if ($BOM) {
    8 V! Z3 j3 j1 V& E( _5 M9 X- C" a
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    2 I2 B. K% H' ^4 C& ^( k
  39.      // 移出BOM信息7 _6 a' o9 a3 W
  40.      $content = substr($content,3);
    & D/ C# {2 m1 w
  41.      // 写回到原始文件8 d# ?+ X( n; I- m# D3 w
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    9 Z5 z$ {7 d2 K2 Y% s* p
  43.     }
    5 c6 h7 k9 J/ t+ l$ R6 b
  44.    }
    / t% j$ L8 F5 y) [) B1 D
  45.   }9 M' w  l$ H/ B6 x6 b
  46. }8 K7 ~" v( H+ ~  M6 `! L3 f
  47. $folder->close();
    2 I" v1 i5 _, o9 J& k
  48. if(count($foundfolders) > 0) {
    1 @' Y' x, p' s- h" k9 X
  49.   foreach ($foundfolders as $folder) {
    9 ]# Y" z9 x0 m* S. S+ `" F" ~& T
  50.    RecursiveFolder($folder, $win32);! [0 ?4 G" x8 z" c# B
  51.   }
    * b/ z6 Z, `5 x( `4 P7 I
  52. }
      V+ j* A* ?" E& D
  53. }/ s$ ^3 w0 |0 H5 M
  54. // 搜索当前文件是否有BOM
    5 v8 D4 S' F( t
  55. function SearchBOM($string) {
    ' k$ k0 j9 q( e* B
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    7 j. w& N  u5 Z' y7 z. m
  57.   return false;
    1 @0 o6 B/ l/ e' E
  58. }9 }3 X# k7 c+ h% A1 E4 p3 z, I8 P' @  @
  59. ?>0 o- R- B: |' ^( ~" P' M
  60. </body>
    2 N  h& f% I% R; O' B0 D
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!2 _& N; {# C# A4 G6 Q, m3 p
5 H, p) ]3 {$ N& p1 \3 H) a0 f# x

本帖子中包含更多资源

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

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.