开启左侧

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

  [复制链接]
62805 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  ( C8 x0 e' \. N- @; v! Y* V
4 C- k* e4 Q* Y0 D
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
& }/ Y3 p, W# x# |6 g# @+ X/ w
+ `* ~$ \' r5 i$ r$ M+ D! W; i( C' G它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。7 a6 u0 U6 k) Y0 O% Z8 R' T
" q7 T; k- C* s. [% o. q
对于一般的文件,这样并不会产生什么麻烦。8 X6 K2 a3 _6 s/ i$ ~
/ p, W  H% E0 v2 l# X
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
4 O) ]. M! x3 c3 x% O* v+ h/ Y; u
* `. R* X* c7 x根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。/ x, {4 K  [& {5 v+ O- z

) A% _* n% w6 S' C8 A由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
5 @4 N/ B9 ~2 I1 |6 m# U
  A. t) b! _3 K直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   3 N' _1 R; s8 l
- M, Y/ N& g$ i. }
然而文件比较多,又想偷懒下,使用下列方法来实现。  
8 M! b: f3 H0 O5 p2 C. M$ ]' i1 y' G3 p0 D
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
* L1 X" K# w2 E1 i; r6 V: g$ e9 u, ]& C7 g: p3 ?& o. S5 q
& @5 W+ h' J; D7 X
  1. <?php
    0 f2 z" Y! _& M1 N+ J- Z2 P2 e& n
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件): Q4 Q( N: g' z. a2 m1 D# M
  3. $HOME = dirname(__FILE__);4 f4 r/ k0 {$ N+ X
  4. // 如果是Windows系统,修改为:$WIN = 1;
    + h' B6 h# h7 s* V3 \! n
  5. $WIN = 0;
    9 F/ C, ^. ]' O
  6. ?>
    : ^1 j# p% [8 S) D$ }
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) R9 ^9 ^* D1 m) x. f5 h: ]) F
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    * I* `' A* F7 f) r/ x( a; j6 L( Q
  9. <head>* i2 G* x' ], ~1 |; ~" l& x
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    , p  R) i: ?* A2 y; r/ Q
  11. <title>UTF8 BOM 清除器</title>
    $ r. @, L2 I! x/ Q" t# m9 R
  12. <style>
    : N+ v: P; |5 p* i2 m. `2 V
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    - E9 S1 O1 T1 {9 o& ~
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    / w7 @2 x" D" s0 `
  15. </style>2 A: g) D* V4 U9 V
  16. </head>
    5 }& G- v* Q% U& p  Q0 x
  17. <body>
    5 R: E2 b" ~  i& M
  18. <?php
    ) L/ k; H2 {* r# G
  19. $BOMBED = array();
    9 f8 `6 Q, n8 p5 [$ U' J' y
  20. RecursiveFolder($HOME);
    1 ]% }- m) Q* x9 L5 D# f/ A2 M" a
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    $ P$ ]* a2 w  |+ t& l2 Q! i
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ( B1 ]" P8 R, G) N
  23. echo '</p>';* }$ E2 j  m0 ?
  24. // 递归扫描0 Q' `4 B. S4 H, |2 V$ ~, r
  25. function RecursiveFolder($sHOME) {
    ) ?# Q# _- e# n% J) Q! n! b
  26. global $BOMBED, $WIN;! k" I7 g2 ^7 L, s- M$ b' k, U0 t
  27. $win32 = ($WIN == 1) ? "\" : "/";. b2 L1 J' y* [2 ^
  28. $folder = dir($sHOME);2 l* k$ h  E6 k7 Q9 |1 X! `$ X6 k
  29. $foundfolders = array();8 ^+ U  e8 I0 f. ?
  30. while ($file = $folder->read()) {0 Y$ A$ ?- i8 U, r% n" e+ t0 s; p
  31.   if($file != "." and $file != "..") {2 b9 G  [  r% e0 p- n* b) m5 g
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){& y- J4 X3 x) \1 N' X- ]
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;9 g" B% ?5 d  F8 f  J) E
  34.    } else {, g0 V* Q7 X8 Y# [8 l7 Y( k1 t, m
  35.     $content = file_get_contents($sHOME . $win32 . $file);- D( N$ n" n- n6 Z# M  @
  36.     $BOM = SearchBOM($content);
    ' E5 l* d0 [6 }0 N2 i2 _  O
  37.     if ($BOM) {9 ~/ s1 z6 J7 R% l- R( ?& X
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    1 L/ k8 e7 \1 F9 n) L: L! O
  39.      // 移出BOM信息
    * g7 c+ j6 T" u7 s, ]) H
  40.      $content = substr($content,3);
    ( t' m$ Q' a! A+ V. R& E
  41.      // 写回到原始文件
    : O% m( w# ^% i% X# |
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ( B5 T% ]) `7 m  B& ~
  43.     }
    ( e! L3 f! j: r4 ^1 |" C
  44.    }8 H0 s4 R( y5 h# {
  45.   }8 [: k8 i* j( e6 X- Z1 k- Y
  46. }
    % G7 t/ a9 a/ E: h0 Z, a2 N; v
  47. $folder->close();9 O) w$ D+ P: y
  48. if(count($foundfolders) > 0) {: R3 H$ x# Y  ], s+ v
  49.   foreach ($foundfolders as $folder) {
    6 A/ Y+ z$ @; E7 q  a5 r6 V
  50.    RecursiveFolder($folder, $win32);$ b# h' g  U% u% ~3 [
  51.   }% ~, d4 G$ R$ \7 M; W  N3 @+ i2 }
  52. }3 I( A) J$ Z. x2 P
  53. }
    ; w, E# y1 d8 I. d3 W; x- P8 }4 i
  54. // 搜索当前文件是否有BOM
    . Q/ a. k% T8 J. ?, K7 H/ Y; D2 S
  55. function SearchBOM($string) { 5 d* e8 S$ N) X
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;; R% d, O1 p& Y  o. v( Q- T% o8 C
  57.   return false;
    / q9 t  v( V9 d. U; r7 N: f* j2 b
  58. }
    ! V9 a2 f- \4 S% `/ t
  59. ?>
    8 c7 F" \: g: K. v
  60. </body>
    ! o, @* h1 ~" x6 ?& _3 E3 V# E
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
0 t. l1 U; z1 ~* E9 K" Z
1 O+ [, [5 p- v7 p, v$ \0 C

本帖子中包含更多资源

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

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.