开启左侧

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

  [复制链接]
67675 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
7 L. S- n, _& _8 ?7 ?& L9 z. T
4 J0 z) r! x9 M. F, C2 w这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。( u2 J% M! _! b' P# u$ n; R
8 Y% g; o* n: ^# E
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。3 E$ v1 R! `( _1 m

/ c' A9 y5 ]. B对于一般的文件,这样并不会产生什么麻烦。. C; h9 V0 X0 Z$ }
3 n% [& U0 U1 F$ d) R  E+ O
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
2 N9 E3 ?9 U, m4 a+ Y% }
% E+ ~- l' P6 ]根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。' w6 G* L) E7 f" k7 z- h
$ S8 C- l' u6 I8 O0 p. J9 B
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
( ^+ r: {5 ^0 s
/ J4 D9 e, h5 G5 C0 Y( }% |# ?! i直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   . Z) X7 U& A1 n( z
' @$ l) }" j: x7 {2 D8 \( {
然而文件比较多,又想偷懒下,使用下列方法来实现。  
6 s# ?0 }& i* {( Q6 X2 b0 |- V
; j( J2 D9 W# o8 d  i将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换, i6 m+ G3 o* _3 A
* N2 Q3 M/ ]% F  ?) c- W4 w
, F7 r" l6 A6 L
  1. <?php & ]* |  x" m. S5 t3 H
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)' V0 D, P7 Q+ x9 D' v+ u
  3. $HOME = dirname(__FILE__);  O$ t: p) s, [& u& ~
  4. // 如果是Windows系统,修改为:$WIN = 1;
    ) w) f( }' C9 |! B& K5 W
  5. $WIN = 0;7 {, P9 U/ B8 }4 L* I2 Z
  6. ?>
    ( S# g: t: x" d8 E' o/ n+ L
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">* P: r3 A1 B+ R0 k5 a
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    & g3 v3 T% L$ G! D  Y
  9. <head>9 F3 S* s* X+ g6 M- A1 C5 j
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ! {$ w1 O5 O. ~
  11. <title>UTF8 BOM 清除器</title>
    , c2 L! q8 Z8 u, C& n  i
  12. <style>
    $ u1 {+ f8 n, T. G5 z/ K/ g; V
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ' a5 d% a* `& S5 h3 {7 e, n
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }4 s, w2 c& |* L5 O
  15. </style>! ^; }! r% G: ?( @6 _2 j
  16. </head>6 N! l  Z3 S+ {1 h
  17. <body>: b" T' k: w+ |2 H$ b
  18. <?php
    8 K* y- u3 [8 z& k, W0 E
  19. $BOMBED = array();* v. U- X& P1 O" K1 C
  20. RecursiveFolder($HOME);
    6 U4 ]$ D" t) \$ V
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';/ a, ]5 Y  y% }& |# p& M0 v8 M
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }/ Y) O3 o- ?( l5 C
  23. echo '</p>';
    $ U# x" c3 Q9 h: V# C2 W
  24. // 递归扫描
    ( o3 ~, y1 B$ h' ~
  25. function RecursiveFolder($sHOME) {
    0 n/ I; v; Z$ U; P$ W6 v! S
  26. global $BOMBED, $WIN;
    2 u& X" q6 @4 a! d
  27. $win32 = ($WIN == 1) ? "\" : "/";3 x$ O3 `" b+ X- |
  28. $folder = dir($sHOME);
    : ~  e. m6 [2 X) r7 a, U* O
  29. $foundfolders = array();
    1 u' I1 r, T% ~! F1 p8 Q7 ]! }
  30. while ($file = $folder->read()) {- {9 X; e6 {6 D0 p+ E* d- W
  31.   if($file != "." and $file != "..") {
    & {5 L# Z( e# `7 e2 f
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){: O( x7 g% W. z, z) v
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    + `$ \7 c# l8 k/ y* i# [9 L9 B) I
  34.    } else {# }- s$ o( L: ], \4 ^5 W" z4 X
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ! l8 F$ ~! e8 }2 W; o- o
  36.     $BOM = SearchBOM($content);) A& d1 T1 c4 h- w
  37.     if ($BOM) {
    ; R+ z6 I4 h  K7 Q% p% T
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;4 p$ i% \7 R2 v% U8 e, d# e" J; v8 R$ g
  39.      // 移出BOM信息
    / F3 ^" P& u$ o6 p* f# L7 M
  40.      $content = substr($content,3);7 q; E+ Y: ?3 l! c1 f1 b& Y
  41.      // 写回到原始文件
    : p: ~. b9 f/ Y* z& h1 x0 s  M7 p
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    / g# J* F" v. d. M
  43.     }
    5 k, V+ ~' @% @* T" a* P) e& G3 R
  44.    }
    - w9 M% C2 B; V4 A
  45.   }
    " r, B6 M" Q( H0 ^9 V' I9 O0 y
  46. }
    $ @1 ^5 p$ h! D. f+ S' d! E
  47. $folder->close();
    9 B' m6 U3 f3 a9 _& h
  48. if(count($foundfolders) > 0) {' `. B( O' e' G) v$ M
  49.   foreach ($foundfolders as $folder) {
    % h9 H- Z; w/ j# N0 y
  50.    RecursiveFolder($folder, $win32);, c% q3 w4 P9 \& {2 m2 K2 F
  51.   }: {* \3 |# n, E  r9 g# R
  52. }
    , d( r6 s' z+ u8 R
  53. }3 {( b. P' c/ V" y/ q
  54. // 搜索当前文件是否有BOM
    - r4 D. T2 ?+ `* V
  55. function SearchBOM($string) {
    ! K: a4 |6 f% @3 z  @
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    $ @) U- O& O8 r3 Y4 o
  57.   return false;
    6 M6 p8 I' H0 `. F8 ?
  58. }& J3 Z9 b- A: _
  59. ?>
    , U+ M" g( D  S. H6 b  \2 f, W
  60. </body>
    . J. g9 ]; J9 ?
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
9 z# y2 C  ~' k; _/ J4 i0 t
  a; S7 q6 L" U8 t1 _

本帖子中包含更多资源

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

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.