开启左侧

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

  [复制链接]
67046 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
2 O9 x/ S- V. V! ~9 C5 _9 S) _1 J& z  ]2 p8 I
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。1 V0 u, o* P8 R5 ]% t, {( L

; b  K" e* S1 @+ I% z: }它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
; V. D0 M) k4 k; A& t1 U) d) w, R2 L. O. B" s; |! _- c+ ^$ C
对于一般的文件,这样并不会产生什么麻烦。
2 L8 S7 {( N6 X
. h* ~+ S, N! J7 V, L: y% e但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。$ L. P& d! ^9 E3 u

  g  Q+ G* {8 v. D' ^根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。* }4 m9 z! u: D
' A0 R, j6 L& P1 ~* d: a/ S
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
6 Q/ w9 `4 T* q8 e1 e& {6 Y1 i
3 B" o. K7 R& t1 {/ f直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   4 X" K! K/ x: S8 ]  b( h9 e2 P% G

- U7 }: x/ _6 Q' u4 b, h然而文件比较多,又想偷懒下,使用下列方法来实现。  / Z* V; V# e. f+ d, [( z7 H3 s/ o/ c
! Z5 }, I/ x$ U6 F3 Q& |& o
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
( U3 ]% n) T7 l. A; M# O" r- m+ K8 X+ {# e3 b  i- ~6 l9 t5 v

; L+ g9 }- |# b5 }0 y- c8 r
  1. <?php & ^1 {" y* O6 W7 k" t' S% J0 ?$ @3 @
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)  R: K+ e& M. j- Q+ E
  3. $HOME = dirname(__FILE__);
    9 X! q3 h8 `* I: k; [
  4. // 如果是Windows系统,修改为:$WIN = 1;; j9 b  c3 d/ t7 V7 Z/ t
  5. $WIN = 0;7 v* C) P) R+ L, K* v8 t2 s
  6. ?>
    ) N; F, [! C! O. M, X
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    # |4 K" j/ x2 F. K2 O5 o  Q
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    $ v$ P5 W7 v( S
  9. <head>
    # {' S; ~- T$ c
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />" E% @1 ^3 ^) P( f4 y2 _
  11. <title>UTF8 BOM 清除器</title>
    : z6 n* G3 q6 f4 L; C. R4 ^
  12. <style>* E! g. E$ m/ `  Q. @% |' f; {
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }' R' n" T2 R% v; c
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }7 r& B5 o- u1 ~7 P; r* T
  15. </style>$ r; ^) U7 b/ b/ P' H
  16. </head>% F- O) `2 F  B3 z  l- h
  17. <body>  p; T- F! Z0 O, H  E
  18. <?php
    ( h8 S2 z! Y/ E# Z6 {
  19. $BOMBED = array();
    # H. k: i9 T0 L" _9 J$ U
  20. RecursiveFolder($HOME);. r; d+ b+ G) }$ T6 ]6 ^
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';& ^; g1 h' f) a6 n
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    8 d' e+ V$ v( A8 o" Y
  23. echo '</p>';
    ! x& a9 c4 [! }4 H, B
  24. // 递归扫描5 m2 x4 X$ y; w0 k, ]0 `
  25. function RecursiveFolder($sHOME) {
    - B* p6 Q: V7 t
  26. global $BOMBED, $WIN;" E4 t6 Z/ z6 t6 K2 b
  27. $win32 = ($WIN == 1) ? "\" : "/";
    & y% D8 ?& m  U! _! C
  28. $folder = dir($sHOME);. Y$ ]( ^2 h* T3 s
  29. $foundfolders = array();
    ) I3 U! ]0 l7 j1 T  L
  30. while ($file = $folder->read()) {
    # l/ [7 }+ V# s! p" Y1 m
  31.   if($file != "." and $file != "..") {5 ~  L, s  I* h$ a* p
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){; q* P# o% d. ^5 |1 d1 }& x
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ; W' T9 ~9 h' u, ^# d
  34.    } else {
    * H7 g0 e8 w8 G8 F: ~
  35.     $content = file_get_contents($sHOME . $win32 . $file);$ q5 s! `1 [* ?2 v6 e
  36.     $BOM = SearchBOM($content);- ]$ s" a5 O7 W6 a
  37.     if ($BOM) {5 R6 ^" f( J4 ~  Z% q2 T. l: E
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    : o; |& e! d. T  _, W
  39.      // 移出BOM信息' Y+ [. j( A9 v/ S8 E% L5 P( e  J
  40.      $content = substr($content,3);+ b, V$ A* p0 i* s& q
  41.      // 写回到原始文件+ {+ F2 B. Z4 a
  42.      file_put_contents($sHOME . $win32 . $file, $content);* W6 Z% e0 u- J
  43.     }* m4 h* J" c6 k& }% ?
  44.    }
    - D3 S- U  e0 U) T/ n+ ^1 D) A
  45.   }
    - D0 P! K5 F. a  R
  46. }
    6 o0 ?% q# g0 v% _
  47. $folder->close();
    % F# ^5 L, {* x: J* D
  48. if(count($foundfolders) > 0) {
    % s; ]8 Y& F$ x$ @
  49.   foreach ($foundfolders as $folder) {
    ( v  @1 A2 k, ^3 t  Z& T
  50.    RecursiveFolder($folder, $win32);$ V, g7 b& _  m1 h( j
  51.   }
    ; Y) s7 ~7 v3 c) W
  52. }
    2 q; O1 ]% J# s' d7 [
  53. }
    ! ^1 }% f% z; r3 W+ n3 z9 z$ i
  54. // 搜索当前文件是否有BOM
    5 G- K/ b0 U5 c
  55. function SearchBOM($string) {
    5 Q/ J4 O) n2 S
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;- h# N5 k; t0 r1 u3 w
  57.   return false; ; D) a; S$ {2 R6 z. F. d+ b
  58. }- S6 s& y, f* ~6 R
  59. ?>
    1 G+ {( f. `6 T/ \5 [
  60. </body>
    2 p" G& f# w8 H8 m) J6 e, u
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!9 _' G/ Y% F! b) Z) D) \
3 P) @% u& T- }" {' K/ L' m) g

本帖子中包含更多资源

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

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.