开启左侧

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

  [复制链接]
59175 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  0 f! ]' B& M' l& N2 }

& a: }9 j+ u. t1 H; ?9 x这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
) Z6 R/ L# O6 [- `7 m0 M9 r
( W% V" }: _& @% q2 B5 G3 @4 d它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
: s( |: |1 U1 X8 X3 X4 b# J
( e9 s$ _- G7 k3 Y8 i对于一般的文件,这样并不会产生什么麻烦。
2 Q* o5 g( o, H" ^/ y) M. Q/ k
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。: J: ^( \& b" \* D5 |2 x

9 d) X$ Z5 O$ w  [4 O根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
8 E# X: {3 u9 j# c  A# u4 y4 f" U4 y  j0 X
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
: ~2 V/ I. u, ^1 V8 ^( o; r7 I( o" @$ \' V
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
, j6 B7 t; B4 l/ J# a! B4 [1 O  b: ]- T5 L
然而文件比较多,又想偷懒下,使用下列方法来实现。  
3 b1 E4 ^: q' x. y
6 X( N; a8 V5 n& j8 {% c; Q将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换/ p# Y( `/ ?3 K* \+ h
/ p- p4 i6 A) ]7 E4 H3 h, H: `5 ]
5 T3 P5 X6 ]  S9 T$ B
  1. <?php
      L3 b2 ~, O! \8 G$ l* R
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 b) }" W2 [4 f. \- M8 Q
  3. $HOME = dirname(__FILE__);8 p7 Z* `3 ]2 T, V4 Q5 g4 }6 W5 x6 r
  4. // 如果是Windows系统,修改为:$WIN = 1;; m0 W  u( q* @1 k) i; U% R
  5. $WIN = 0;
    3 N% z" u: N" }" `  U9 G
  6. ?>* ~9 A3 u5 x7 u' k9 v1 }! {% |
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    ; E0 b7 p, s6 u0 M5 s& C- @* P& O
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    0 O& G$ `  W, Q3 h
  9. <head>  C  Y, J/ D) s/ g$ i
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />/ k; S" k. S9 ~. u
  11. <title>UTF8 BOM 清除器</title>
    . W( D9 n( e# t
  12. <style>
      ^1 N3 Q. c2 {' F& i0 r1 l5 E3 f
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
      {9 M* Q3 v! t: @) J& v5 P5 N
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    + Y# `% c9 U9 R7 {2 a
  15. </style>
    $ G: h9 p& t8 d
  16. </head>% D/ C+ Y- d/ R+ r1 J6 h* h8 t% Z: J
  17. <body>
    * m, N, x0 S& M& p- t
  18. <?php
    6 t7 j2 o% h& F. u$ Y2 Y' t
  19. $BOMBED = array();, f. d& l/ h. s# D
  20. RecursiveFolder($HOME);) h; Y5 h% d1 I* B
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';  m7 Z6 C( G! _( B* P  d3 K
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }9 h9 x! u; J! u; Y! B1 V  m1 u$ X
  23. echo '</p>';* d; D+ [" J0 t1 G' @( A
  24. // 递归扫描
    8 c/ `/ |# r! e! ?
  25. function RecursiveFolder($sHOME) {
    - R7 X' i7 T8 w8 a2 m
  26. global $BOMBED, $WIN;3 j/ ]' t6 V  d
  27. $win32 = ($WIN == 1) ? "\" : "/";6 p1 l' p7 x  E: C1 [- h
  28. $folder = dir($sHOME);
    - U3 b& m, A: U2 f
  29. $foundfolders = array();
    : j" c. E* `0 O
  30. while ($file = $folder->read()) {
    " h( o2 I4 d+ i8 W) f  x
  31.   if($file != "." and $file != "..") {
      O: ^/ Y: i7 ?. |; P! B
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){+ o) B. W9 y- i, V; R
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ' {3 B/ C6 O5 Q' m% c, O" h
  34.    } else {$ p% w" c# i4 r  ~8 ~6 _
  35.     $content = file_get_contents($sHOME . $win32 . $file);6 P/ Q( q2 p! R
  36.     $BOM = SearchBOM($content);
    ) }0 I. a8 X4 A/ @
  37.     if ($BOM) {0 L+ |  m# R0 I: u; t
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    1 a9 [& ~4 I0 p% H
  39.      // 移出BOM信息
    + F4 L- _/ n8 \4 I. M0 C/ A
  40.      $content = substr($content,3);
    % w0 ~  B( A3 A& Y5 J
  41.      // 写回到原始文件
    & v2 c* {% _8 G8 m' q  r
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ) Z4 |5 O0 x+ o' O8 u
  43.     }( g+ E  m6 ]. R1 V1 }* D
  44.    }: O, q4 e; }- M5 t
  45.   }
    0 I, \4 _! ]8 b6 l
  46. }% ?$ A0 ~  l! e( s9 o4 o* M
  47. $folder->close();. D, e$ e# x% n
  48. if(count($foundfolders) > 0) {* P. \5 q: z/ f9 Z- j, S- u
  49.   foreach ($foundfolders as $folder) {
    2 k0 d# u2 o5 [! @
  50.    RecursiveFolder($folder, $win32);; M0 U5 {: E2 z2 p6 }9 U& r$ y
  51.   }& ~$ P) ?4 w& [+ w2 ?2 J0 ?, D) x
  52. }
    " b) d# w7 R: W5 i; l( c4 ]% y( [
  53. }% e5 p; h8 Q7 t
  54. // 搜索当前文件是否有BOM
    3 }7 y$ m/ Q1 j6 s# t
  55. function SearchBOM($string) {
    - F$ r( M  w1 s* L
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    & J, i- R4 N" l% }3 M. t% {+ o/ n7 I/ Y
  57.   return false; 4 W; y3 G, S5 p5 \
  58. }! j+ V8 l' J# |3 T7 {3 Q
  59. ?>
    # S# N- ^1 Z( a* L
  60. </body>
    & I% l7 [# n. G
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
7 Y+ U  O, \; U7 d* L* C+ L
% @' M, f& {" l1 V8 H2 m9 e

本帖子中包含更多资源

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

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.