开启左侧

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

  [复制链接]
58311 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
0 D7 P. n% @4 ^1 v6 j6 ~6 x. t* f: N
, l+ n/ Y) `$ Z+ V6 }- a6 h0 Z' g这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。3 r. p' T( N8 M0 D. z1 p

- s' m& e! m4 \: ^: _: r它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
1 M7 {: I/ Q% a- I6 b
% l! {, a) R  h" ]5 a对于一般的文件,这样并不会产生什么麻烦。
7 F- d8 \. J2 p+ @# F5 q
# R; t1 Q6 L1 R! ^但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。5 E; [+ M; G* u) f" E+ z' t

' @9 Y1 b5 ^+ _6 \1 u% p, y根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
0 l3 x3 t9 g* j
# D* B$ L) Z5 T: E7 J8 v由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
2 F; T' n" G% d' v) i! \! e
" J, j8 E; T/ \! o* F直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   9 A$ u; k' t8 k# q; ?
! {# W  y; N: @" ?5 C
然而文件比较多,又想偷懒下,使用下列方法来实现。  ' h* O1 \- H$ j* ?1 w  z

7 }* f& z: i1 b. q将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换) T+ G( `! t8 n# R) t. h$ V
( `) ?- M2 [& ^

5 [% E0 ^' E1 j
  1. <?php 9 `# v6 K/ T7 _+ A, S
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件): W' L7 y/ I1 H
  3. $HOME = dirname(__FILE__);
    . ~+ b2 h/ y% g8 |$ l* M: R) K" U
  4. // 如果是Windows系统,修改为:$WIN = 1;
    4 k0 W3 S( v9 y, H  V- ?
  5. $WIN = 0;
    2 A% h( g; m  ?% K! {6 p
  6. ?>
    $ n6 j" q' t8 j
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    , S/ k; q( g+ k8 i& F9 |
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ( d, V1 z% r# x: ^. G
  9. <head>  K; E# K# b( j4 ^7 S- @
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />2 v7 I+ n6 D: l
  11. <title>UTF8 BOM 清除器</title>
    ! D$ d5 X4 |" c! {2 D5 R
  12. <style>
      e7 M6 X6 D. m( @, Z; y1 v
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    8 K+ z0 s0 Q- ?6 F* B
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 [6 U8 X3 z( i
  15. </style>
    1 ~% V5 o  F( b# @
  16. </head>8 F3 Y9 X5 K" e* [- @* R
  17. <body>5 A# R0 u0 C& {  |- ?+ j4 ~- Y  T
  18. <?php
    : ^9 x2 w& X1 T' l$ D* a. R
  19. $BOMBED = array();
    : h# }# i( A. ^9 L
  20. RecursiveFolder($HOME);
    , Q- m1 u* S2 F
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    1 t0 v( L6 N- n; P( Q- @: W
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    & z! J& [2 {% C/ P  j
  23. echo '</p>';2 f% {. p+ x* o6 g4 ?/ I/ h( q, v
  24. // 递归扫描7 b: S  x# `2 l  z! C5 |8 [- I
  25. function RecursiveFolder($sHOME) {
    / x* y* x; H8 o% m0 U6 |
  26. global $BOMBED, $WIN;* E$ @: [( p6 o8 P# C
  27. $win32 = ($WIN == 1) ? "\" : "/";
      h2 J: u8 d, |- `; w
  28. $folder = dir($sHOME);  l: E1 m  O0 Z  ?9 C
  29. $foundfolders = array();
    , d0 o3 y$ N$ Y- f3 r* P
  30. while ($file = $folder->read()) {
    0 w  m4 P' b8 h! I* j% N
  31.   if($file != "." and $file != "..") {2 A0 b/ S* [8 K9 r. J. a/ ~
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    5 s4 Q! F; I! O2 y6 m) \
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;" |7 `9 Y4 j/ D  H
  34.    } else {, u) B6 T8 y0 }8 l2 _6 l4 b
  35.     $content = file_get_contents($sHOME . $win32 . $file);7 ~8 K( z; l  Z' C
  36.     $BOM = SearchBOM($content);* z; f1 T4 a4 h# a8 B& B6 V
  37.     if ($BOM) {. N8 V' M1 p0 a8 K2 E+ B( i
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    % u6 l4 T$ M! J3 C" V
  39.      // 移出BOM信息  x* S4 E5 @6 \7 C  `
  40.      $content = substr($content,3);
    7 D- A7 z9 N' L" p6 e
  41.      // 写回到原始文件8 W2 p3 f) _- ?7 k# c* }4 o/ Q6 N
  42.      file_put_contents($sHOME . $win32 . $file, $content);( A! r6 x( n& Q; E/ P; ^
  43.     }
    8 U* d& f8 n: A6 [
  44.    }7 t8 W+ P  w6 Y
  45.   }
    3 U5 [) R2 H) |) U0 h% @, R
  46. }
      q( Q+ n! q" G8 y+ I, m
  47. $folder->close();
    2 X. H" {8 @2 e1 N4 o/ [
  48. if(count($foundfolders) > 0) {
    + W% F2 y4 a% J" u: h7 l
  49.   foreach ($foundfolders as $folder) {
    0 @1 K# `% w$ @( e% P, x+ A& Q
  50.    RecursiveFolder($folder, $win32);
    & c; D9 P+ I8 L2 q  L# ]
  51.   }6 A  L% b! T9 e( J
  52. }
    / K% {) H7 b# i  k2 g
  53. }5 h# [( \) f* |. |5 ~+ K& W, |
  54. // 搜索当前文件是否有BOM
    0 |" Y; F8 ]0 e7 e; f+ ]# \
  55. function SearchBOM($string) {
    7 ^" C, r9 b2 \  _
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 E: T$ n% z# T2 J% s. c; l
  57.   return false; 6 a# L2 [; x7 P3 d& G
  58. }) f0 d. b3 D4 ?3 M) ?8 Y
  59. ?>
    4 Q5 A4 q2 L; p6 v' b3 m
  60. </body>
    + ?! T7 T- Z0 }2 M- E6 i# M9 e
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!+ o! u; _0 A$ i+ G+ Y' b0 z. m
3 B8 a1 M- G3 J0 B4 p

本帖子中包含更多资源

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

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.