开启左侧

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

  [复制链接]
67181 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
1 u, W% I$ b3 Z1 {% w3 q6 q. ~. Q& O2 T  [5 R
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
7 E( p& ^) J  y5 N# `. E. I1 v5 n8 P, a  O& F1 q& [- b
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。! d4 V2 X! |% u. G* n  s5 ]
) Z4 {* c9 r# w1 N: @5 |, `
对于一般的文件,这样并不会产生什么麻烦。' f+ ^* R9 q8 k

/ L( a4 \% X- e3 Y但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。1 U# }; ?; `' t+ T4 {/ Z/ P) P2 ]

9 B) w# H' L* ~) q* M8 ?根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
2 I9 y+ g, O' L3 B- N) v7 W
" t4 m1 W1 v" l0 c) S/ ~由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!& A. X& E4 ]7 @" G5 q' K( a5 F  R6 B

, B8 Z' o" S- E- o直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   9 P- x6 b7 Q/ l9 D, \
# C) [5 q4 i, W4 X" |- Q; e5 v) c
然而文件比较多,又想偷懒下,使用下列方法来实现。  
  M# G' z+ I7 w5 `  p7 x
6 d0 A, Q! F, t. Q将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
, x) u* w! F9 ?0 s% I* Q# W
$ r2 Z' Z& u( H/ v
& l( b" Q2 |% N$ ?
  1. <?php
    : q/ O% G% ]6 N7 W2 j  y2 I' S
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    7 F7 R( e' k. l( m$ }
  3. $HOME = dirname(__FILE__);8 U. m+ c  A- `& Q
  4. // 如果是Windows系统,修改为:$WIN = 1;  `0 _$ H8 j& s
  5. $WIN = 0;, K) g# u! L; O5 x# l
  6. ?>
    6 v, B7 i! L3 P1 g
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">% }/ o$ Q! R1 s1 z
  8. <html xmlns="http://www.w3.org/1999/xhtml">" j9 R: A$ B; ]/ j+ D: C
  9. <head>
    ) w' M# O5 a, X' {) u
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    . `* |6 E# M- E/ T  T9 }' S$ |$ H) T
  11. <title>UTF8 BOM 清除器</title>
      E* n  I1 k8 @+ h- f9 F5 q+ |  G
  12. <style>
    / j) f* L0 |5 _& _! T
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }/ W: ]/ L2 M3 `
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ( \; [: G2 P. H# |; G8 F
  15. </style>
    ! f4 k! S' D; c  K
  16. </head>- M1 C$ Z! Z8 W" ]7 X" D
  17. <body>
    6 ]( V& U9 @7 p9 S
  18. <?php
    " d* L: `/ z7 E( L" h  j6 Y
  19. $BOMBED = array();
    ; z. j6 _3 z+ R+ s' ]
  20. RecursiveFolder($HOME);& X" K& W. G, b3 c; A3 V& K
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';  W6 @: z0 N; q9 F9 k6 {: J5 ?% A! D
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ' }! [( a' H1 [5 E( ~' J
  23. echo '</p>';4 R. c7 n: k. N$ o$ e
  24. // 递归扫描
    : m$ ^# T% y/ y: d
  25. function RecursiveFolder($sHOME) {
    ! d! E' `9 a7 u8 |7 F$ e2 A
  26. global $BOMBED, $WIN;8 _% s9 w$ y- N
  27. $win32 = ($WIN == 1) ? "\" : "/";
    5 Q5 Z5 I5 A+ K
  28. $folder = dir($sHOME);
    4 @8 Q4 h  y; U8 o4 e
  29. $foundfolders = array();: Y# p1 B1 C( n# a
  30. while ($file = $folder->read()) {
    % ~2 G7 m# I2 i# V% n
  31.   if($file != "." and $file != "..") {
    7 I+ K2 J( V# u$ X! u
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
      j- p# B( H$ z# `7 m7 l3 E
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    3 L( E+ B/ P/ a4 I& k+ K* S' g
  34.    } else {% S* U  y& H0 p, c2 b0 f
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    2 E" \7 O) C5 W+ I8 J
  36.     $BOM = SearchBOM($content);
    5 c1 N2 Q8 {# M1 a; W
  37.     if ($BOM) {
    $ m/ d8 b3 |+ j* j5 }
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    5 g+ R$ R8 y+ `' L% q7 q& }: x* \! \
  39.      // 移出BOM信息
    - g$ u( u2 J% m" s) ~
  40.      $content = substr($content,3);. h( s% `, @! J! \  H' n
  41.      // 写回到原始文件
    / {3 I5 N+ ~' ~% P5 R+ A
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ( H8 D1 a$ F2 _8 Y8 `
  43.     }
    . q7 u$ h+ w$ R4 O( X
  44.    }+ \: n% @# p1 A
  45.   }
    7 r* @, j( C3 S8 G' b4 I  I" S( r
  46. }- l, U. X1 J( G  `2 G
  47. $folder->close();: H, D! J7 w* {2 p
  48. if(count($foundfolders) > 0) {
    ; t% a* E0 V6 s3 D0 g+ g5 P
  49.   foreach ($foundfolders as $folder) {
    - C8 H/ r% Y9 K
  50.    RecursiveFolder($folder, $win32);
    + x4 H8 G) f  \1 w1 j! j+ x1 ?
  51.   }
    ( p0 s5 d4 ^9 k1 R/ q* h6 `6 [0 }
  52. }; g* b2 b  y- Z6 J; \& b5 E/ i
  53. }
    1 D7 C& b, p3 K; [7 U4 @
  54. // 搜索当前文件是否有BOM
    ' ^+ P- }. o5 G* j" p  r9 t6 I, h
  55. function SearchBOM($string) { 8 |2 T$ u% Y) m
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    2 u, _, @) R" m# z2 ~& v( |; P
  57.   return false; : i5 _) A- S  j) _; s
  58. }
    3 M: t+ i* V3 I1 g2 v# }
  59. ?>2 z& n1 U) k" J( P4 U
  60. </body>. M% B# r) Y% c. b
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!( S) @$ v$ \  g- W  M. T* o- ~2 b

  Y" E1 Z" Q7 T, x+ d

本帖子中包含更多资源

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

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.