开启左侧

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

  [复制链接]
67287 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
$ A- E5 d4 }% F" E1 h. S  _
- \! t6 m6 f( z8 X0 U; N8 e这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。' I& n* k/ U# q$ g' u5 j8 L/ Y2 v% u5 ?
% D2 T- G! Y0 Y! Q4 d
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
* c: N' q& L8 w' K& ^0 U' t; S6 K! J
  S$ Q, ?( p, G. {) _. ?对于一般的文件,这样并不会产生什么麻烦。) O/ s4 Z) ~+ x- z# ?) V

* W3 D1 D0 {- r: X. v9 {# z但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
2 g: k4 `, }" k$ Q! Z& q1 C% d% a$ z5 m4 W3 S
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
, \8 C" ^. o% L3 a
- d' U* }$ l* Q7 b7 B* S由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
( U$ N) ~; \+ q/ E6 n  i$ K* W% R
% A* P1 X+ n; c; I# I6 ]直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   3 X9 I3 q( X7 V: ~/ o( v
: f1 |# ?: k/ r# Q8 n
然而文件比较多,又想偷懒下,使用下列方法来实现。  + C- J: ~0 A4 a% \: b
& w4 ?4 W+ ^( Q* p& J3 {( I7 q
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换& D, U8 a$ }" J# i

" J6 W7 ^* q+ q( ^) G/ I. s  c3 A
  1. <?php
    2 i6 ], W" J5 ~8 Y) [. W7 e1 Q
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)- t- p  `% f# u1 P
  3. $HOME = dirname(__FILE__);6 M" q8 g: N) l7 V: t9 R
  4. // 如果是Windows系统,修改为:$WIN = 1;$ |6 c) M1 |: {# ~' S: V
  5. $WIN = 0;
    ! V, T& O0 o( `+ x7 p
  6. ?>" E. |% O* s  Z/ U8 m! {" h$ i+ g
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">4 i* y5 ~( @7 U" n0 f( R  N
  8. <html xmlns="http://www.w3.org/1999/xhtml">9 S: b9 y' v+ O% a5 `
  9. <head>) J* b4 ]$ ~! `' }; D
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />0 v& Q( K4 B4 C# ^* N9 v
  11. <title>UTF8 BOM 清除器</title>
    + D- w& b3 C' i6 N! w" A: H
  12. <style>
      L/ }9 @7 n9 H2 \$ m5 v- u6 l, E- {
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }1 p& a  Z6 T! H
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }1 A% [8 u  U( E& a( k" E
  15. </style># y* t* P. B. T# b6 V
  16. </head>
    ! g* |6 h% G5 G
  17. <body>
    ( R4 s8 x" M1 D* Z7 g
  18. <?php4 j7 \$ O2 u  N8 f* e% [1 U
  19. $BOMBED = array();- a; J: G! W) |( l. b0 `- H4 E0 d& M: V
  20. RecursiveFolder($HOME);
    9 R$ S" }/ d4 I6 Q! ]
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    7 B; ^& s- \! S' Y
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    3 E% X) r  [8 W2 D
  23. echo '</p>';% u9 [: T" B, U, b0 J6 ~: _7 P
  24. // 递归扫描3 |9 O3 A) V9 L- d" j$ F: s( I
  25. function RecursiveFolder($sHOME) {4 [- y' z, s5 I& q# R
  26. global $BOMBED, $WIN;8 d" Q# Z, w$ C0 x' n/ I
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ) y9 ?! ]5 c4 M" F- R. r: g' y+ J
  28. $folder = dir($sHOME);3 W$ n9 V1 k* }* W7 ?4 G
  29. $foundfolders = array();6 W% W2 o3 c/ Z  [
  30. while ($file = $folder->read()) {
    2 A$ P0 g! J$ C
  31.   if($file != "." and $file != "..") {( P/ ?3 D1 E+ t! c
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    " k: `* a" _# o! c$ `
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    , [3 G8 m. B6 n) y
  34.    } else {
    8 W) p6 q" |# V8 x( V. [4 `; }- K
  35.     $content = file_get_contents($sHOME . $win32 . $file);. U7 \2 l# l) O1 T2 R! G# O$ l
  36.     $BOM = SearchBOM($content);) v, V' {/ L, x* A% u
  37.     if ($BOM) {
    ; s# b  h; X0 Y) u/ `
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    % v; Q1 z5 \! }( s* x+ t8 J/ x4 n
  39.      // 移出BOM信息/ Z4 m( A1 [5 z) h4 u7 F: }
  40.      $content = substr($content,3);
    . M- a( R9 ?0 p! s2 h* L3 Y6 f1 T2 F% P
  41.      // 写回到原始文件) Q+ C8 v, G5 E/ T) E* }
  42.      file_put_contents($sHOME . $win32 . $file, $content);! D- B4 I: g5 \9 x! I% q  Y; R
  43.     }
    ' G5 _5 b8 n7 X0 N; F% P/ L
  44.    }
    " `9 p$ v9 o- j; G& @' X4 d3 W
  45.   }
    : u. f2 D/ o" v2 t
  46. }+ K- M" o9 N! R) ^5 [
  47. $folder->close();) x1 G6 i( y/ O/ U* P* f
  48. if(count($foundfolders) > 0) {
    4 k# m& V% h; @# y0 X9 I" O
  49.   foreach ($foundfolders as $folder) {- C' F- H1 ]0 @. N, X8 R  ~
  50.    RecursiveFolder($folder, $win32);+ @% N& y; C- i) T6 ?7 G  b
  51.   }
    0 u$ t& M) U8 D9 ]+ e) B% h
  52. }
    8 C  m9 }; U4 U
  53. }
    - b2 d" V4 F  |" c: ^$ u
  54. // 搜索当前文件是否有BOM
    0 N" h0 Q3 {# E5 g6 H& H* d
  55. function SearchBOM($string) { ( W9 P  g7 W" N
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;# k3 G# @5 b& `8 o4 c$ o; h$ V9 @/ f
  57.   return false; $ y! h" h2 Z) o% e0 U
  58. }
    8 {- I4 f+ N5 M- |% S- S' {
  59. ?>
    2 }( j: Z2 E8 e
  60. </body>$ ?7 z" [) M% V8 m/ u! A" N& P
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!2 h/ i+ L; Z9 F% @0 t
: ]0 ~* c( b; M

本帖子中包含更多资源

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

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.