开启左侧

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

  [复制链接]
68011 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  ( {& m, O& S3 q  L! U+ o" [/ b$ E

/ n1 C+ v: y$ b/ [这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
  t9 ]9 \$ X. `$ I/ g& X( x* [: C
0 c/ M& S6 o% _0 G: V- L它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
% k' W2 ]6 U" B* ~
# p1 K+ G* K+ w3 v. ~% h" `对于一般的文件,这样并不会产生什么麻烦。' c& x: A* Q# i; y0 U9 k

' |* N+ `! K4 o7 c. B8 V但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。% K" \" T- z$ i: x6 H
" L+ B: }. v) V* n+ J
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
- c7 n. k8 Y; q! _4 h4 A" ?# C% W- d/ Q7 M7 t& w
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
1 w& q1 C7 w" [; z" f2 u+ p( a1 L4 d
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
( x8 d) t5 V5 z! p* v/ _0 [$ z" ^4 G  l" i; A
然而文件比较多,又想偷懒下,使用下列方法来实现。  . P* U* M" V: [. K, Z9 S, P
* r3 k& `3 s& D! p# D  e/ u
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
( f9 R+ d# o' D" ]" g+ y8 b& p% T9 @, S5 X4 {! z

" p# I; Z- H. f1 Y
  1. <?php
    8 s& D+ ]+ g6 F. _+ n
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)1 F* k/ W2 P  y( ?+ E6 ~
  3. $HOME = dirname(__FILE__);
    4 Y; d4 q3 F2 a
  4. // 如果是Windows系统,修改为:$WIN = 1;
    " x; ~4 i( v7 O+ n& p0 }; t2 z
  5. $WIN = 0;
    4 j* Z0 S6 l7 s" M* g$ b
  6. ?>; d! q) k; G$ l" K4 e& @  h
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    + \9 n7 k  W" F' l9 M
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    9 c3 [  v) X2 e& `0 A- o
  9. <head>& b% ]5 I% h* C6 B, p
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />0 J6 {6 ^9 z  o# r& u
  11. <title>UTF8 BOM 清除器</title>
    ! z2 O# e8 N* ?' R
  12. <style>' M7 }" T; K3 _* ]2 Q
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ! a: N: |; q1 i% _% v
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }* Z7 a8 `1 K0 K7 U/ b
  15. </style>0 G; M0 I9 K% J# Z# c" a# G" Z, D
  16. </head>/ M) K3 R2 u1 g% i# ]5 F
  17. <body>2 Y3 J+ M, E7 Q* G
  18. <?php5 |+ ?( h- Q1 _
  19. $BOMBED = array();
    8 p. H- s8 |' w
  20. RecursiveFolder($HOME);! X$ j. C; Y) N0 V; l9 b+ X: `, g
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';6 t8 `( \0 h4 L" T" T5 X' I
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ' \7 e2 x& a4 q7 E& ]
  23. echo '</p>';0 A% q( |1 [+ d! G( U& V9 }
  24. // 递归扫描
    8 N" c9 m+ T$ G5 y% b
  25. function RecursiveFolder($sHOME) {
    + t3 N7 E$ V6 G
  26. global $BOMBED, $WIN;
    6 D7 s& i. H7 F& x2 x$ A% R" U
  27. $win32 = ($WIN == 1) ? "\" : "/";
    : T$ k8 W" k7 ?0 T2 g8 ?9 B
  28. $folder = dir($sHOME);* v/ q* L$ \' l" Q
  29. $foundfolders = array();! o+ w9 T3 o  x7 G: C. q
  30. while ($file = $folder->read()) {5 {' U/ \( [0 `+ H, G9 I1 y
  31.   if($file != "." and $file != "..") {
    + J' X' C! J7 Y, |
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){2 U$ G& A3 T& {5 H
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ) X# C  W2 o) W0 n, K9 q3 o
  34.    } else {
    7 O1 Q. f: w, a! {& U3 i9 c
  35.     $content = file_get_contents($sHOME . $win32 . $file);% k9 W7 [  i. J' i8 x9 c
  36.     $BOM = SearchBOM($content);
    . d8 ]. m/ \$ g0 L- y
  37.     if ($BOM) {4 j& Y" b- _4 z- D6 B! c
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    ( z! w* j5 S) _* T' d) N
  39.      // 移出BOM信息: Y3 q% H+ O7 b. B- ]
  40.      $content = substr($content,3);  l" E: G# [/ d. o3 }2 |' G  V
  41.      // 写回到原始文件% [: t& |0 m: P' S: ^6 A3 p- A
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    " [% K  w; v! V' @2 \
  43.     }
    & x+ M+ N$ P) p$ Z4 T6 j- K
  44.    }
    8 I2 M2 p: Z- m  a6 z* E' @
  45.   }
      M+ R& X1 }5 L
  46. }  M5 t5 d$ b% ]3 d) p
  47. $folder->close();- n& y" s8 t4 l
  48. if(count($foundfolders) > 0) {0 {8 x" X8 s/ }) w
  49.   foreach ($foundfolders as $folder) {' e; V- j3 g7 T" U6 [, p
  50.    RecursiveFolder($folder, $win32);6 x* C% f$ Y+ q/ x, V4 Q# H
  51.   }7 X& J. @7 p: v" |& J7 f
  52. }4 \( U3 A! B9 Z! _9 [, t
  53. }
    / ]& [6 B) j2 a) k
  54. // 搜索当前文件是否有BOM* ~, k/ c5 T; H& A
  55. function SearchBOM($string) {
    / _) m2 G* F* H0 ?+ p: C7 @
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;  Q8 y6 H- z) M3 g) m
  57.   return false;
    ( N3 O  C( M: \' |! r/ I
  58. }
    7 ]+ |$ ?9 l6 T& J4 {' D/ m
  59. ?>
    6 a' w+ m2 _' n' T
  60. </body>
    ! [+ |( L% ]' s
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!9 [: Q# J" D9 V; \2 R& m

8 t3 A2 d' D3 y3 t( T

本帖子中包含更多资源

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

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.