开启左侧

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

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

- k& a2 m0 M: b$ o8 y这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
" g4 h6 v8 ]8 P+ \& d
9 m6 t) x! c% R6 `+ s& U它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。7 p: {2 y$ M/ F6 h+ D7 T, ~
8 |6 e$ Y' W# ?) d, k
对于一般的文件,这样并不会产生什么麻烦。
& M9 |) ?7 e% s5 `
$ n0 G1 d4 _4 ?0 q3 {( d2 T* z但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
6 a* K1 B' B  |! c: o* w
0 K! L5 o' z! K9 `/ p根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
, `* R; L. r4 q; d' t/ L3 g  W% l) g+ c! M) q7 w, B* j( t
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!8 ]& L4 c5 m" U0 C" C8 N+ L7 Y* v

9 s* T7 z4 N( M直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
2 r- W. J* Q- N8 P  Z( v
/ B- c+ R. w+ r7 P) C6 }0 |然而文件比较多,又想偷懒下,使用下列方法来实现。  
' _7 w+ L: J/ R" S0 S6 J* P! ?+ J
7 f6 W  ~+ ]# W0 e3 [  d将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
8 c5 U- P# e2 j5 ?, D
4 N+ j$ K# `! A! ?8 K3 g
6 Y# a. z% N! V  @  @" c% A  @; U4 F
  1. <?php
    + y4 D& p. c$ L1 F7 @$ _9 G1 |, A4 ?
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)! A# D5 M, P  `! [8 O! A$ @
  3. $HOME = dirname(__FILE__);
    : ]0 B0 i$ ~; P1 f/ h( P$ v) _
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ) j  o2 P/ O$ g5 l
  5. $WIN = 0;! O9 c$ E# {" l+ U5 X
  6. ?>5 @" B" H4 v, [. V. ^
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+ t7 Y! d  g1 M# u
  8. <html xmlns="http://www.w3.org/1999/xhtml">
      ], D" ~- `0 R
  9. <head>2 Y" k/ P  Q5 F$ [% ~- j. s
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />% f4 ^$ d# I9 R8 P8 T
  11. <title>UTF8 BOM 清除器</title>- }5 D" u! w/ a) M6 v) Z
  12. <style>6 {: d$ s9 i6 s8 |- I/ S4 d+ J
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }% S0 t8 N8 h9 L
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }: v2 B3 K3 Z- M7 z) l" v+ r6 ]
  15. </style>
    / ^; G: G0 I* y* R0 ~# a; ~
  16. </head>8 r" g9 `6 A$ T4 m8 ^
  17. <body>
    / A$ {! s8 V3 z6 w+ Y
  18. <?php
    & Z7 j. k6 r2 j! B8 r
  19. $BOMBED = array();
    - J' O# Y. V6 z
  20. RecursiveFolder($HOME);! |5 t5 s8 Y2 v& x5 f' T
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';7 M. j: z0 I! J$ p0 u; s& n
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }/ X3 L5 E1 L- s/ j# V
  23. echo '</p>';5 C0 B3 X# e: J1 w9 K
  24. // 递归扫描
    , s; n: ]5 }* B" q# e
  25. function RecursiveFolder($sHOME) {
    4 `* s+ F3 ~2 \- J
  26. global $BOMBED, $WIN;9 y) E+ M' g6 U' m6 @5 i
  27. $win32 = ($WIN == 1) ? "\" : "/";+ x& Z0 p8 m. N! x. g; ]
  28. $folder = dir($sHOME);
    # s8 ~' D+ r9 \
  29. $foundfolders = array();
    9 [- m1 H4 x- B" L! U) S* G
  30. while ($file = $folder->read()) {
    . s. h( y# Q2 u/ [
  31.   if($file != "." and $file != "..") {
    * t# |+ U0 ^% I
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    " m0 }! J5 z* y9 S& ?$ q
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
      p. G# E+ D/ Y0 h4 B2 T
  34.    } else {
    * N+ Q  W3 ^% U) A
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    & K* ?7 S: f$ r7 q
  36.     $BOM = SearchBOM($content);
    - M" }( {1 w& `* R) w% a
  37.     if ($BOM) {
    ( C' L3 I0 `2 G1 s" Z
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;3 k; Z0 V/ ]& O" o! }, w5 P
  39.      // 移出BOM信息
    $ I  N! K/ K/ g, v
  40.      $content = substr($content,3);
      s, O$ c9 T" ?6 g
  41.      // 写回到原始文件
    2 v/ U6 n: |+ h" O  y8 u) f5 q% l
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    : j+ u2 w( f& w! s
  43.     }
    : Y0 N- Y5 I7 {0 m9 v% l
  44.    }
    & f7 |' G0 L% G: \3 N) Y
  45.   }% @  {- A" s, S' v- R, n0 L3 S
  46. }$ E  [2 e7 p6 ^/ u7 }' c- @
  47. $folder->close();) ?8 G7 P: u# F$ t( I& B/ j
  48. if(count($foundfolders) > 0) {
    6 x/ i4 u: {. E7 A2 n! e% N
  49.   foreach ($foundfolders as $folder) {* n8 i) Q4 v" [
  50.    RecursiveFolder($folder, $win32);
    + c6 q* u6 ^( H  |( d3 Z4 e: {
  51.   }
    4 T  J; A" L+ n9 e/ I0 |
  52. }! q$ ?: R  C( R0 y
  53. }' G) k' A, e: V. J1 w$ t
  54. // 搜索当前文件是否有BOM
    ' W8 o/ @$ K) y/ m, _* i
  55. function SearchBOM($string) {
    8 z: ]* {; b0 ^$ @) }( v1 V! ]! N
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;2 \8 D: w$ W% I" b6 O1 f+ k6 w
  57.   return false; % L9 Y- t) o7 G- W( @8 {+ |) i
  58. }% t5 {4 U- [) D& \: Q. M+ w
  59. ?>( `( K  L% V( V- t; z; Q: W
  60. </body>1 {5 n0 V8 \3 t; w7 M
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
' _) D0 \- s% v; z, R+ F( P9 C0 U& s% o$ m5 O' V

本帖子中包含更多资源

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

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.