开启左侧

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

  [复制链接]
67271 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
" X4 \) V5 v# A1 e# q9 r/ J" g  n5 v9 N# ?% g
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。7 A% F# B1 [0 i, o( F

3 V; w" F, R* E. N, m0 U7 b1 b% ]它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
" w$ D; Y3 o' y; j! |2 B- A7 {+ ~( {+ x" m( ]5 d" T. O; p9 u
对于一般的文件,这样并不会产生什么麻烦。
4 U. q' @- X! F- L8 z- o' K" [  P) F) u" O; A+ p
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
7 @3 G" V. [: I6 G. @- @# }+ ?
. l; v# d. r5 L: h根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。2 h$ {- j5 G8 y/ [/ ?: K9 N

( Z3 @3 M/ v. a. I  J3 I由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!; [' s" P; R' H3 L0 d  c
$ `. U! W; S) n8 R% ]! [" g  v4 j
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   2 A5 Z1 d. [2 g# w+ }
; U4 w$ J# S( ]9 E3 D2 }
然而文件比较多,又想偷懒下,使用下列方法来实现。  
$ m, l6 ?3 T( G
4 k+ `! o' H# x' h' D将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
) g- W, I8 L: Q% O: ^% W5 Z+ q% }: f
6 `2 j4 }/ {+ Y
  1. <?php , L6 I: W9 ^: x  {1 G0 y0 Y: |
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    0 [; L2 e- d# P: Q: l
  3. $HOME = dirname(__FILE__);8 [4 }+ N* j' K: {
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ; Z( t0 p- k8 H: e" I
  5. $WIN = 0;" g/ m% v4 x  ^4 M0 L! X5 z
  6. ?>/ f, L$ I: z; ?3 |5 A) L% I0 _
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) e2 m6 b! {2 ^/ R/ a) r
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    - [- v5 [$ w/ N6 E# X
  9. <head>/ v' U% l! ]6 W
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    3 F: I# H& x' m* k  z
  11. <title>UTF8 BOM 清除器</title>8 O# F6 b. @0 g$ y, O: ]; @
  12. <style>( w% b6 B) d. y
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }$ g) Z% t( N$ Y2 E$ N# _) |
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 W( O- ]! m0 D# o) u) [7 @0 L
  15. </style>
    ( O! `3 g5 z# }6 [7 E: y3 r1 b
  16. </head>
    7 K# b3 }" j% t3 j
  17. <body>
    % n1 t( R' O+ \
  18. <?php, f3 p( `- A( K5 a% ~. i
  19. $BOMBED = array();4 d/ O& {% f7 v0 [$ C/ w6 }
  20. RecursiveFolder($HOME);
    % }: U+ Y8 v" w, f" O: i
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';7 P/ m, |2 }  [+ a  R; D
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }7 N  C- E" f( L7 _
  23. echo '</p>';6 \4 w0 d) H7 ^) o# |/ @$ y% Z) A
  24. // 递归扫描
    * j, ~# n9 y6 |2 y9 ~, L" m
  25. function RecursiveFolder($sHOME) {: B5 m! n' `0 G& t! }4 C' E0 {
  26. global $BOMBED, $WIN;8 R% W' F$ G2 `3 D+ s+ G( B
  27. $win32 = ($WIN == 1) ? "\" : "/";
    2 a) d: S# U; M9 x  @4 _
  28. $folder = dir($sHOME);
      d0 f) V, {7 |; K- k
  29. $foundfolders = array();9 M1 Q4 y" P) n5 X. u
  30. while ($file = $folder->read()) {
    & E) ~* _1 ^. ?2 ~9 y
  31.   if($file != "." and $file != "..") {) \4 R3 x3 f3 H3 H" \5 x! H
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    " S; ?6 K! t; ~) h
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    1 y# F4 q9 J  z8 M/ S& V3 B
  34.    } else {1 j* k1 L% O* W
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    9 |# n% l; W4 e4 x0 x; w' s( H4 P
  36.     $BOM = SearchBOM($content);0 a3 k6 k- E  k# `. ?0 R) y9 F
  37.     if ($BOM) {
    ! B; o) h4 N6 Q! b$ N" U* X* M
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;5 e4 O4 r/ Q6 i0 R* b1 F
  39.      // 移出BOM信息
    % [3 M" W$ J- T6 |
  40.      $content = substr($content,3);
    , z' W% b. S- G3 j* k
  41.      // 写回到原始文件
    / L4 z1 P" I& J6 a! `
  42.      file_put_contents($sHOME . $win32 . $file, $content);, q" H* S9 t% g
  43.     }
    ( q; U3 b8 y9 X$ Y% R5 w
  44.    }- D$ I6 D  w/ q; r- t
  45.   }
    , M& n) V$ y+ H) i1 y% M
  46. }, \$ ?2 ^2 h$ B" s
  47. $folder->close();
    $ h/ a; x+ s0 L$ B5 A7 W
  48. if(count($foundfolders) > 0) {
    $ }$ z# i  c6 X9 o9 y4 z
  49.   foreach ($foundfolders as $folder) {1 [# P+ r2 @2 [6 J, h  P: n, _
  50.    RecursiveFolder($folder, $win32);
    . O& n0 w# _" m, ^3 S  \2 R7 b
  51.   }0 b7 ~5 {+ l% F3 l
  52. }
    7 a+ K7 b% C* {( @
  53. }; w& ]7 c' a% u, g- g
  54. // 搜索当前文件是否有BOM
    8 \; _1 }: L5 `/ g/ z/ ~
  55. function SearchBOM($string) {
    , R- K2 P$ ~8 I( K! p; E# V5 I# `
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;0 |( V& r+ }% R7 i) R% D; s3 D
  57.   return false; % N+ S6 P! a& n% q
  58. }
    / t* S, K1 y" J+ z
  59. ?>
    2 _! r5 R5 ~( \/ X1 p: _
  60. </body># O4 E# `' Y+ F8 z% }; `
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!% _* i$ Z- ?8 c2 a/ }
0 ^+ C) Q8 l$ j& @6 e. q6 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.