开启左侧

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

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

, \. D2 D6 e4 o' @7 q这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
! `! J( _  A8 d5 K' ~$ p
8 v! G8 Q7 u* l" [它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。. A1 X, r! @% i4 x/ B! y  \
/ k6 ~4 a0 k6 O1 ~% R
对于一般的文件,这样并不会产生什么麻烦。
' p& u' N) @  j3 g; R0 a: S' r/ s  \
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。; b) k1 V' J+ |; p7 L! C1 x

$ C0 A1 E6 L% O- q  P- c& j# U根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
0 c( Z- e4 y1 u5 t+ P) `: v, }0 {" j+ `5 @3 O5 J
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!. G5 y& z  W3 ]) C  I4 _
9 [5 W% F" C2 E! h& d8 q" _, ~
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
! T- T" P; f  c" _6 E  c0 C
* U# }- D3 q! I( D然而文件比较多,又想偷懒下,使用下列方法来实现。  ) }* W- q9 x: j" s$ G0 Q

- M' I8 f6 E, L; ?1 t将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
" Q/ h4 ]7 N- b  C% Y2 h- E$ n& N- i  G3 w% C
$ q3 @7 \$ W3 i1 ^# t
  1. <?php
    5 N  e( a. G4 x) |) R
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    ! e. A9 o" N6 E, G& e- b. A. t, C
  3. $HOME = dirname(__FILE__);9 ]0 g$ y2 h* B" k( \  h8 M
  4. // 如果是Windows系统,修改为:$WIN = 1;8 Q5 G$ q4 i- V
  5. $WIN = 0;8 G: i  c# ~1 u! K# G
  6. ?>
    0 a6 N! V1 l7 b/ i; \: A
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    : F: k) m' Q% N1 W7 q! L/ c
  8. <html xmlns="http://www.w3.org/1999/xhtml">/ F1 |+ A4 r% ~2 b, U/ K* u
  9. <head>
    6 Y5 q" \5 I+ y3 I) k* \7 l
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />1 {5 B3 L8 \$ c) ^
  11. <title>UTF8 BOM 清除器</title>. W4 u8 [- _7 u, J% C9 o) [
  12. <style>
    ) y* r4 h1 X8 i. }+ @- J
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ) |- R4 v9 p1 M2 v
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    2 N* M# r. u/ E) F
  15. </style>3 f/ E; [( K3 \9 e) S% l7 X
  16. </head>
    + Q$ _3 V( q; d. i" V1 }
  17. <body>
    * U8 f. [: a( J6 z8 y
  18. <?php8 v2 z  A  b6 c! Q5 ?' }! S
  19. $BOMBED = array();0 q2 \8 m% d, w4 i/ I
  20. RecursiveFolder($HOME);
    ! H+ C. ^/ |( z. M6 L
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';& Q7 ?" ?4 O2 P/ S" p, k
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }# u" z% ^$ X9 ]1 O5 ?4 M
  23. echo '</p>';3 C3 U3 b" v7 \( M% X& I8 ~
  24. // 递归扫描
    / K* r( h5 _1 Z+ X4 v0 j7 D3 O
  25. function RecursiveFolder($sHOME) {* g5 }: O# l4 o- X3 P& E, _
  26. global $BOMBED, $WIN;
    0 z8 [4 {# Y8 a+ e6 V: [/ v
  27. $win32 = ($WIN == 1) ? "\" : "/";3 J' w9 L0 B. K8 g& f7 J
  28. $folder = dir($sHOME);- Q8 ]" @9 j* a% K' Y* o
  29. $foundfolders = array();0 o, o. I6 i. O
  30. while ($file = $folder->read()) {' J. W' J+ U. `/ K4 {
  31.   if($file != "." and $file != "..") {
    * ^3 @! O0 W2 @! Q
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){  p. x8 k0 w( ]9 ~3 C
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    - v8 ?% h" Z- A/ @+ c2 f/ F
  34.    } else {
    5 Y8 Z( i/ g6 _7 [+ z
  35.     $content = file_get_contents($sHOME . $win32 . $file);$ l& H- |8 C. N: \; _+ M
  36.     $BOM = SearchBOM($content);
    2 Q* S. T& j& Z; c/ ?. b
  37.     if ($BOM) {
    % x) ~2 _6 r4 _# Z6 ~* T! @$ [
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
      f8 ~1 l% x5 v7 T: I( ~+ B9 C: z
  39.      // 移出BOM信息
    " Y2 i  H( H" I
  40.      $content = substr($content,3);
      ]* @0 j9 ]6 `
  41.      // 写回到原始文件
      \- D( M+ v1 L) R
  42.      file_put_contents($sHOME . $win32 . $file, $content);; t) V1 k# \0 `
  43.     }$ E" O, b( a/ @6 k2 p$ P, Z
  44.    }
    1 B% t- r, x* H# \1 h
  45.   }2 g4 B" Y8 c% H
  46. }
    2 [8 v  Y  ?: J6 D; x# c
  47. $folder->close();
    4 B) E/ P8 z5 ]6 Z
  48. if(count($foundfolders) > 0) {, M0 b# _& n1 T  {
  49.   foreach ($foundfolders as $folder) {9 Z9 ?- F( p6 O# r+ L1 F( Y
  50.    RecursiveFolder($folder, $win32);
    ; x' c! C' p1 G
  51.   }
    5 f2 `& w7 P  Q" w" b
  52. }: f: E( R. U4 L/ N5 h- I( M1 o
  53. }
    5 v8 m# w# a7 A3 W- Z3 E
  54. // 搜索当前文件是否有BOM
    # c8 J5 B% ~" M* k' o) {9 A0 c: U
  55. function SearchBOM($string) {
    $ u) h% A+ \; U$ k1 a9 {
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;* H  j( j( k  B: n) y' m
  57.   return false;
    7 Q; [. S4 Z5 z/ \; g
  58. }
    2 b9 ^+ q8 `. d
  59. ?>3 y# c( C; K7 |# T; n
  60. </body>- D+ V6 c: w5 m9 S+ Y' Z
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
3 W7 Z8 M& c0 e8 R* A7 {6 x. N9 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.