开启左侧

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

  [复制链接]
62930 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
; D# O" `2 o+ U) C
) ?$ g0 j5 I1 p4 d9 f$ V这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
# ]/ p! r- y- @& x* H5 l9 Y) @, I( Y* t$ _9 C
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。* z% U5 _1 \' ]8 g1 Y  J3 r6 X

$ J' E5 p! ^6 c( \1 y对于一般的文件,这样并不会产生什么麻烦。# X# W* a) i0 m0 W) f; R. @

: Z% q+ o( K7 g. q; j% s5 y% s但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
% ]5 x3 U; H% O, O9 K
* R% p3 T; `  o# Z# p+ q根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
- L$ N6 I  ^0 k" J9 W* ]' L: j$ l- Y( D; }/ v+ a7 x( u
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!# A# \. Q' p0 N. g+ s7 T
* T. _1 e3 n8 Y6 Z& x1 M9 S
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
7 J9 H/ z9 P+ N  V( l& I; e% s' r) D' f) N, p0 a
然而文件比较多,又想偷懒下,使用下列方法来实现。  
4 {" d& l. ?9 Z8 r9 e- K+ x1 T  H3 D# I' h0 P% ^; Y( A
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换- I9 N& p" {6 ^" x& W6 B4 M
% ?" X( |. P# Z7 n7 H2 X: U
9 K$ v0 v  k+ b- [/ W
  1. <?php 3 d1 w9 q% [4 s( }4 ?( b8 n* b
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)$ H9 V$ Y* ^1 w; D& A- t7 D
  3. $HOME = dirname(__FILE__);! k+ o' \! w+ L/ E' G" S1 ^
  4. // 如果是Windows系统,修改为:$WIN = 1;! q6 s, }- f7 H& e9 q' p: j
  5. $WIN = 0;
    2 I' O) V; h3 B4 w5 c+ c
  6. ?>7 a8 x# @: i" c( w# U
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 d! Z0 @( y, {3 P) z
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    . s  h0 b5 n" X, j0 v# K- C
  9. <head>
    - O9 V, C/ K+ G( j
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    % H; K( B3 k2 `" e/ L
  11. <title>UTF8 BOM 清除器</title>
    * A5 w; F- Y* a, E4 l8 _
  12. <style>1 j7 R# S* t3 k3 B7 p+ w% D
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    ) w. d, U$ h5 _/ ^2 y
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 s. ^" d4 q1 C0 d
  15. </style>. x0 w- \- P; ^# \, ^' f% q
  16. </head>( r6 L1 ^: [6 i3 H+ O
  17. <body>) h& F1 y( n5 [. V
  18. <?php
    7 _; y+ Q" N, T$ |& L9 ^
  19. $BOMBED = array();6 _/ G3 R2 I, ?. s% v9 ]- ?+ P; E
  20. RecursiveFolder($HOME);0 C- h6 z+ O: T( S) u! [
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    ! V3 f; T% }* t
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }2 y2 R5 ^4 W& q* D+ P1 n7 a
  23. echo '</p>';4 N. ]+ d/ I* N, b+ X+ Z0 x4 B0 R
  24. // 递归扫描* H) a  |6 g7 {3 R3 D
  25. function RecursiveFolder($sHOME) {
    0 T/ R8 z% W3 H1 D$ w8 d
  26. global $BOMBED, $WIN;
    % v4 M) I: O6 A( {# j+ ^
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ( r+ t5 \% r' z. o
  28. $folder = dir($sHOME);
    * e) V% P% Y+ K: t3 h& O* W! `1 @. M4 f
  29. $foundfolders = array();- k4 p3 h: x" L* E
  30. while ($file = $folder->read()) {& H4 v; u. @4 k! ~: d! t9 Y0 y
  31.   if($file != "." and $file != "..") {
    4 U' y3 R: v# o6 w
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    , t' X! A" p2 i
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    1 C3 z- W' {$ [  w" L
  34.    } else {' I& e' Q; a  N! L* e8 `
  35.     $content = file_get_contents($sHOME . $win32 . $file);* A* A2 G7 f& |' J2 N1 m: O
  36.     $BOM = SearchBOM($content);$ ^; Y5 u' f- F& l* {8 W8 Q  }
  37.     if ($BOM) {
    * c( S- J, X& _) O
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    3 l) ]" j$ P8 U5 c& Q
  39.      // 移出BOM信息
    $ `' q3 o7 P2 z& ~; _
  40.      $content = substr($content,3);
    $ Z" k$ y- p0 ~3 R  b( [
  41.      // 写回到原始文件4 \& u/ {" {+ S3 m, S4 W
  42.      file_put_contents($sHOME . $win32 . $file, $content);1 D3 w9 \3 b% Z( d; b0 a
  43.     }' S: Z, i# G. w# @+ }/ \
  44.    }
    ; s3 x( ?& ?2 W; p' c
  45.   }
    % f3 Q0 Y! q. N! S  V# B
  46. }
    * C2 F: U  W( D$ X9 ^/ J
  47. $folder->close();4 }8 Y3 n3 A& x
  48. if(count($foundfolders) > 0) {* S6 l, [/ b; ]+ M
  49.   foreach ($foundfolders as $folder) {
    ' }, c$ y- x  ?9 k7 ]
  50.    RecursiveFolder($folder, $win32);+ h6 ^8 b/ Q) T5 X) @( c$ ]
  51.   }+ l; q' H( {9 ?' {
  52. }" q% |, G' H1 ]) i, d, y' i) n
  53. }
    1 N5 `6 n' U0 p5 Z) t
  54. // 搜索当前文件是否有BOM
    7 F) \/ P8 I7 i
  55. function SearchBOM($string) {
    ' k) b0 B' v! v! [
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    : N8 w" X1 f" U+ V1 D
  57.   return false;
    / j9 d  ^  B$ ~' `& H
  58. }& d, n$ n+ A0 p' m1 _
  59. ?>
    ; q7 \! M7 p2 H
  60. </body>: t* [% d" j( P
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
1 n% {. ^7 u6 ~& f' F$ _; L4 A" f& ]/ S7 @( |; T! H; F! h( D

本帖子中包含更多资源

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

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.