开启左侧

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

  [复制链接]
62926 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  6 u# ]( G1 \( P$ R" Q

9 K5 w0 E4 f$ K( a$ `- u这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
; ^* [% t7 Z$ m- b% U% L# z2 I
* r1 L- Q7 {/ b& e4 c0 R( \它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。: x( F2 H$ O8 V
. P' q: O: v* ]0 m
对于一般的文件,这样并不会产生什么麻烦。+ p' D% Q7 {& g" c* l

6 p0 f5 B( @# |! E, s但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。2 {; e4 E# r- g8 M$ K

# \2 U" v, @$ A% E: q9 d根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。5 d) X! V) _: W* s& p

7 m' h$ k5 m9 a6 ^由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!* \; f+ W5 x( ?! S( f/ a3 M4 M$ V' d
$ ^* z% j! k. z
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   / d4 @2 L9 c/ _/ n- H  \- I- k
/ X( B0 z, |5 u  {
然而文件比较多,又想偷懒下,使用下列方法来实现。  2 z: w; _6 ?$ f7 Y! q

* m- h: Q" a2 W  F: C将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
; |5 `7 W, w5 O5 M# J) A% y; Q/ ?- }- i6 U1 j& h! `
! M0 i9 e$ f$ i! a9 e
  1. <?php
    6 S$ C$ Z. b5 E
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    * b+ Y' }9 {2 C% {( ]7 v
  3. $HOME = dirname(__FILE__);
    5 ~. ]6 {# i/ m9 U7 Q( V% O
  4. // 如果是Windows系统,修改为:$WIN = 1;
    7 s# y+ _; p6 P) n
  5. $WIN = 0;, Z$ K5 S% g5 \" B+ j
  6. ?>
    % q" `/ u0 l5 Q- P5 v) x4 M5 C3 @; s
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    ) @2 n3 [1 \. a" T# H
  8. <html xmlns="http://www.w3.org/1999/xhtml">' q8 H: t$ x+ |) @. W+ j0 _) i9 X
  9. <head>5 a2 b! Y" f% K' q  J8 Q9 P+ H7 Z
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />/ k' e! H8 m+ ~4 n- H$ ]! y7 `( p
  11. <title>UTF8 BOM 清除器</title>- u( `  V* A9 ~. j) V4 L
  12. <style># _* j9 d4 \- z
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ) _. b0 h# }7 u1 t# a# F
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 L2 U7 U0 r9 t2 N; M6 b* d
  15. </style>
    3 z& q' l- S$ W, ^. ?/ a1 o0 G  N
  16. </head>& |0 J& E- L5 m( g  L1 T" |" W9 o
  17. <body>
    " r# Q# y7 E9 E% T, b2 b
  18. <?php
    2 Y" z- s% q6 O
  19. $BOMBED = array();
    7 U8 L/ m: ]9 K
  20. RecursiveFolder($HOME);1 L4 Q* j6 a$ q4 `
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';: R; \/ @( F  P7 n( i. W0 Y+ y
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }* R& D: L! w- A5 R1 H. @' k
  23. echo '</p>';
    + w! s! T: K& k' M2 F
  24. // 递归扫描, a( q5 C8 j, {5 y0 D) A$ Q
  25. function RecursiveFolder($sHOME) {
    ; L6 a4 i, Z3 @% |9 F4 H
  26. global $BOMBED, $WIN;6 t, X% ?# A) U$ `: t
  27. $win32 = ($WIN == 1) ? "\" : "/";1 w" u0 f# o6 `) S3 @0 O/ O( }
  28. $folder = dir($sHOME);
    2 f. H4 m: R7 N: s! D/ G
  29. $foundfolders = array();/ x& A; A4 |7 g; ~, `& X
  30. while ($file = $folder->read()) {1 c% x7 j/ q: V$ J$ V
  31.   if($file != "." and $file != "..") {5 f4 y  B2 }4 Q: v2 z5 w
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){7 l$ M1 G3 ~3 J
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;# u; ~1 B- T! y# ^
  34.    } else {
    . w8 G7 T# G6 n$ R0 p9 C
  35.     $content = file_get_contents($sHOME . $win32 . $file);! V# E' F+ A: C5 H8 c
  36.     $BOM = SearchBOM($content);
    8 x! z$ q$ K* d: H: q/ i6 G6 N
  37.     if ($BOM) {
    , i5 L: k! c9 A/ o
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    " z* Z( k# {8 ?# ~
  39.      // 移出BOM信息5 I% I4 p' i+ H3 v, @
  40.      $content = substr($content,3);
    / t* q$ o2 W( ]  K
  41.      // 写回到原始文件
    + T- H+ Q: V' X. V( }$ @
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    ' F: O1 l* b4 `; }5 X$ t; u+ |) r6 g5 X- h
  43.     }
    1 Z# M) I. Q" x) L4 i4 M
  44.    }
    + I" k. Z" Z3 T0 l) J
  45.   }6 ^9 @! T$ E0 \2 @, Q* i
  46. }
    ) ]0 ]0 D' O+ H- f9 Z7 U% J7 s
  47. $folder->close();
    - N8 G; X5 n. T3 v% Q+ S
  48. if(count($foundfolders) > 0) {/ T* o+ K+ e# \3 m( {
  49.   foreach ($foundfolders as $folder) {6 |9 W  K* i' o6 q. K. c- I
  50.    RecursiveFolder($folder, $win32);
    7 ]  A! ^$ D2 J8 J# y
  51.   }2 V  N5 G* Z& ?! ~6 ], C7 H! n
  52. }$ T$ G$ _9 e( j
  53. }
    ( }9 m6 U; u0 g& I1 K7 I
  54. // 搜索当前文件是否有BOM" x6 s! \6 N/ m1 B" s
  55. function SearchBOM($string) {
    , a& I9 h# z5 R! c" K
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;8 x2 e: h$ O: r. h! M3 R: j! f  _+ N
  57.   return false;
    3 z4 t2 ~! x* u, I
  58. }" x: V5 X; X; q. z  H
  59. ?>; h/ M7 q0 S; Y, r0 I9 J1 m
  60. </body>
    " w! Z2 r; c! c9 i; {1 \
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
2 n- X$ e: I* z9 S% B1 k# n6 x( z( `2 `6 S! M; u! u% d+ J$ F

本帖子中包含更多资源

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

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.