开启左侧

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

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

& N0 y) N# y. E& k# T) D这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
8 V4 d5 H) J9 p$ r4 J; d  g9 C
5 \; y2 R! F( [8 @. X; h( s2 e它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
8 Q% h9 Y8 a* O* W* i# B
1 J8 o' J7 n, D" }# `$ a4 p' S对于一般的文件,这样并不会产生什么麻烦。* R. w2 c+ c9 j+ _
: y; w3 A% q/ w  ~7 ?
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。+ e7 J+ H1 `1 p5 Z3 t
3 F: c) k+ u% z+ A# e% N
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。% d+ L4 |$ _4 ?& Z: G4 ^

; H$ X5 X2 W1 _% O  g由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!9 n7 h* t* t  E( V) _
3 T3 C4 }9 r6 `4 K. I( \$ N6 C
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
4 p; x7 s( z, b
$ m7 b5 m: W: `/ F; E5 X* m4 B然而文件比较多,又想偷懒下,使用下列方法来实现。  
! p2 O7 T# |: U! c. q
& H. H: j# D0 g8 |: K- Y/ \! i将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换( D, F% N! [0 I4 w( ]

; G1 S: u. a) M1 u
) t+ a: p& q+ b6 @8 [" ^
  1. <?php
    ; {- |3 I# ?- ~+ W, {9 p
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    3 p3 e: G3 s: W5 K% B
  3. $HOME = dirname(__FILE__);8 v) P' U9 i- H) Z
  4. // 如果是Windows系统,修改为:$WIN = 1;  c$ |' B$ f6 X, `
  5. $WIN = 0;1 Z/ D' t5 E5 W4 t$ v6 A
  6. ?>
    8 g' g* N! `7 w  f
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4 C% g4 `$ y( h$ k  V* N$ V
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    8 I* F. F% u3 c9 O0 Q7 m: y$ u
  9. <head>, Z9 I2 e/ g3 ?! y3 |+ _
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    : Y+ x! D! c( \& f5 Z7 B/ \
  11. <title>UTF8 BOM 清除器</title>
    ; }# ?& ~! a. D2 q  j( V* Y
  12. <style>/ W2 \5 `, }& V" \8 K" P
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    % G& Z* D8 y% |% h8 l- X
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 F" V! E0 d( y: V4 \
  15. </style>( f; I. f( ?& I# t2 |
  16. </head>) e( E9 d) B4 ~' I
  17. <body>4 u& H7 d+ P8 u+ N4 {* U& L! Z& U
  18. <?php
    " ~' e0 n3 |9 C, k  F( N
  19. $BOMBED = array();+ r6 R+ Q3 i  K) `" G' w3 n
  20. RecursiveFolder($HOME);1 W. y# y# E1 h$ p3 A3 _, \
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    9 n. w; O# ?# _" e/ E$ D: m
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ; U, t. {/ h! w! m2 {* C6 \/ _1 {
  23. echo '</p>';
    ' q( g  @' ?. y' r9 V
  24. // 递归扫描
    . G/ a4 j8 t- j: Z8 Y; p8 ^
  25. function RecursiveFolder($sHOME) {) J8 C/ K% v  E5 J2 {
  26. global $BOMBED, $WIN;3 v' T# m* T. a
  27. $win32 = ($WIN == 1) ? "\" : "/";5 R5 ]( T7 a7 q- q5 X( W
  28. $folder = dir($sHOME);
    - Z) s+ R: m# y3 f3 ?; G
  29. $foundfolders = array();
    0 h4 R+ B' _6 o9 [% g1 e3 J  h9 \& \
  30. while ($file = $folder->read()) {
      e. I3 P4 M$ D1 G( j, K
  31.   if($file != "." and $file != "..") {3 f3 g& o/ U2 \; i$ [! J% \( k
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){  b8 v: }# u, u: v# D1 @  y* t
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;. T% D2 @$ x# r7 T! V) R& W
  34.    } else {& K+ s8 w3 N1 Y! l
  35.     $content = file_get_contents($sHOME . $win32 . $file);* f& {# L2 i0 v- t% x. \$ N$ i% O# i
  36.     $BOM = SearchBOM($content);
    ; [/ o, B" C7 j+ A( S1 s
  37.     if ($BOM) {
    1 r/ V; _5 I2 ?
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;/ ?" [4 h* a; m6 l
  39.      // 移出BOM信息
    : }& X% ]  K' U& h
  40.      $content = substr($content,3);
      P# Y1 ~/ p8 S7 ?! ]/ t  _
  41.      // 写回到原始文件
    8 O+ r2 ~1 {9 i
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    7 V( N" C3 l2 k! J
  43.     }. Z1 d! ~% i6 M: @; G, B
  44.    }9 N$ W- C. R2 d  s& k
  45.   }3 O: X0 q5 y: H9 ?+ ~
  46. }
    8 q. y. ]4 K! O+ O2 ?8 |
  47. $folder->close();
    " _0 F, t; L; O3 d$ }
  48. if(count($foundfolders) > 0) {. S+ u& e; D" g! O/ Y
  49.   foreach ($foundfolders as $folder) {
    # z& @' W' I1 a8 S3 Q0 D9 F% T
  50.    RecursiveFolder($folder, $win32);
    8 Y! `. A. M' U0 r
  51.   }: R- u6 k& A+ ?3 v2 f, D; S
  52. }
    2 d4 q: W0 |# h, f
  53. }
    4 S) W. x! V+ I3 T/ J
  54. // 搜索当前文件是否有BOM
    ' E% b7 K/ y0 m) U9 w; f( @
  55. function SearchBOM($string) { . W0 K. ]  ]6 f4 }6 N0 `' M# d
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 z7 B. S3 S, U8 @  b
  57.   return false; 9 }% M* q4 e: `% c0 C+ q
  58. }' }% Y0 E6 M) s4 Q1 c2 d. i2 H6 B
  59. ?>
    / V$ ?* P  ^8 ^/ ]+ }5 G
  60. </body>  e" y# l) z! t+ O6 O
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
% [, k( }" T& a, K" L2 G  e" K9 G% O& f. F  [) u4 B

本帖子中包含更多资源

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

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.