开启左侧

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

  [复制链接]
62066 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。    h! |4 Q4 Q/ U% Q5 E* K
9 W8 n# N7 u% C" T
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
/ P  _2 y/ V  @
' V7 n$ X7 d. E4 K8 f' @它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
/ t* U9 g! ?6 A
3 \9 M3 w" N$ q( x7 E对于一般的文件,这样并不会产生什么麻烦。  g1 ?3 ^+ ?' B) S2 C
* S: U5 P$ V! q) n) \
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
- n8 s* E. O8 j9 a: O: p5 _, f) w4 q$ @7 D0 _4 Y% d# ^
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。' L# k: J6 E: f/ k- T2 ?- a/ X) m
1 T  s9 h8 f8 ^. T% N1 J9 A! J
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
- V% C% T  z& I0 o, c- b0 Y; o
9 g" h, ^! ?: @1 o直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)     t! c: k, t' _: k$ f: M
+ k9 d" c0 ?* _& s2 h( j
然而文件比较多,又想偷懒下,使用下列方法来实现。  
, |5 [; Q3 i( U" M$ F# y+ n; a1 }% Z& J/ ~2 G& J
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
# g# q% n% ?* W& w5 {; n3 x' |9 I  _2 b6 [9 |$ t
8 |9 o$ d- E0 ]& \* s& P
  1. <?php
    1 G* T# B# u; _4 i* I
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    / A$ E1 e6 L9 L! v
  3. $HOME = dirname(__FILE__);* y$ Q- |* \9 D: S, ?  s
  4. // 如果是Windows系统,修改为:$WIN = 1;
    7 S" ]4 M' J" ^8 X- @- k
  5. $WIN = 0;
    ) J* ]0 q, D+ y7 Q3 l
  6. ?>: i% R4 l( u) R, G$ o) V: _
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">1 r6 F3 M$ z/ f4 L. j
  8. <html xmlns="http://www.w3.org/1999/xhtml">1 R/ \- [. |: b' [3 D, ]
  9. <head>" P5 C  s" U. h. |5 Y, }
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />0 z) K% F+ Q, U8 n6 N  m+ F
  11. <title>UTF8 BOM 清除器</title>3 l% r# l$ c6 a% ]! S8 I- X$ ]+ q2 M
  12. <style>
    ( X+ S1 @9 s0 ~& T$ ~
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    4 G9 s$ j. F  u( a# I
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }" R- B; C8 B5 b
  15. </style>
    . q$ q/ @6 d" ^) y: z+ l/ G
  16. </head>1 J" M7 `% l# K, R- f( E9 s
  17. <body>$ D' a1 M8 z  s
  18. <?php
    * {* Q. ~7 R) x) m
  19. $BOMBED = array();4 u6 w% ]3 |. p! l  h' O6 y% ^
  20. RecursiveFolder($HOME);
    1 A) M  H" I" I7 ^$ v
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    + Y. u$ @( U# f  }/ A$ g
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }- H7 ]2 N5 S( I; p. V/ z! P
  23. echo '</p>';) b' \( u9 Z$ o/ A3 Z1 A, F5 m
  24. // 递归扫描- `  P% B! o4 O8 r
  25. function RecursiveFolder($sHOME) {
    4 G/ D+ e, O; t# a. ~
  26. global $BOMBED, $WIN;
    4 n" y+ @. W9 H
  27. $win32 = ($WIN == 1) ? "\" : "/";. T- R) q# r3 T
  28. $folder = dir($sHOME);* Y+ b+ P7 Q7 o# o. M) V! I
  29. $foundfolders = array();
    $ A6 Z; i6 {+ w5 s
  30. while ($file = $folder->read()) {  G- b+ o4 u2 Y1 F; `
  31.   if($file != "." and $file != "..") {- c' ?8 A% o" v8 Q( Q
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){% Q6 H- S! k; |- o
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ) E; N. ?4 [# x4 R( R+ y3 O( M
  34.    } else {
    ( a: O% |$ T& j" M# x
  35.     $content = file_get_contents($sHOME . $win32 . $file);2 W! h  `% @. H7 d& M
  36.     $BOM = SearchBOM($content);- ^5 v; J; B5 W, ?+ M* Y7 J
  37.     if ($BOM) {
    9 d, g, W, V& Y0 _6 x
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    ( c# Z7 {; X4 k. i+ B/ f7 }# k: q
  39.      // 移出BOM信息
    ( Z; C) ?1 t( M3 ~5 D
  40.      $content = substr($content,3);
    $ o7 ^: C5 q8 R. P2 V" n3 z5 b
  41.      // 写回到原始文件
    # k. h1 x6 O1 O- I# m
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    . C  J! {3 a0 L$ J% d0 S7 r
  43.     }
    ) g$ z  ?* R3 n% A" ?4 R  m
  44.    }
    2 W, |3 l/ d) b! e5 K3 s8 h
  45.   }. W# X0 w& H- F2 X0 ]
  46. }' ]/ W6 a! y& F& c$ U0 i
  47. $folder->close();1 T: x# q# M' j; X4 T
  48. if(count($foundfolders) > 0) {
    ; h7 h/ R  g! n3 W+ d4 z
  49.   foreach ($foundfolders as $folder) {* @. f/ E# \% z0 I% L' @
  50.    RecursiveFolder($folder, $win32);' A. K  {; m9 @
  51.   }
    : r2 V# ^8 q% @2 Y/ x; \0 L
  52. }; Y( h) E; I1 T4 X+ _: [% D/ Z8 O8 S
  53. }
    4 B: G7 d! O9 Z$ e
  54. // 搜索当前文件是否有BOM$ s+ h/ {7 [5 @; d  F
  55. function SearchBOM($string) { . p0 ~5 u( t# _, n) d& b, Y4 a. \
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    + W" c& e6 l' T* X' L2 i* t& W/ `
  57.   return false; 0 F0 m' [1 }/ E6 P6 [2 _
  58. }3 A* h4 H1 T4 t' E. i" j1 C7 Q
  59. ?>
    0 D, n5 Q/ J$ t
  60. </body>
    * n' w$ Q& ?- w+ O$ n0 k
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
% P" x/ E3 o% }: m( k# Z5 n) R) k; Q- b6 f8 J

本帖子中包含更多资源

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

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.