开启左侧

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

  [复制链接]
66862 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
7 `3 e! A1 E& [' X: @( n
) G, U% Z* h- |0 L  W+ y0 z! \这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
! i5 R$ h$ m  ~- Z' s, o/ Q
1 P0 n8 Q( l! y/ t4 v3 s4 O1 D8 l它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。( R( i0 e+ [, c# y/ `
% f6 \2 h% |# O7 m
对于一般的文件,这样并不会产生什么麻烦。
3 n- B+ _0 R/ a5 n" e
& `0 Q- h+ m& s9 J; [- x& S但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
+ v, V% z( }! d$ J/ @( Z- b5 d0 X4 p% \, P8 r6 f$ e7 Z% |/ @. K
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
$ Z' J/ ~2 A# l  Y8 u. L. |+ v3 `5 X9 _
. E* z& q; p" r6 Q& [% m3 }7 j由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!1 K9 x( p% g; k+ h
+ H  F0 ^' r' k' v
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
) |0 w0 ^3 n. Y$ d9 u9 X/ r- z4 [; y# D; N
然而文件比较多,又想偷懒下,使用下列方法来实现。  0 h$ p" I( @- w4 N/ q* W2 Z$ t

- P! t2 K# H' \+ e5 `* a5 T将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换" z$ ^- m0 J+ M7 `3 P5 c0 O$ R

' C! b/ `/ o) B
0 X% @, q. \9 ~! R
  1. <?php
    4 ]3 s8 R9 p( c# X' h) h$ m. P; n
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)! R  W: q. F. E" J: @, O
  3. $HOME = dirname(__FILE__);7 G" N2 x  V9 x, j( z
  4. // 如果是Windows系统,修改为:$WIN = 1;
    7 g" g( b2 K* y2 O: w
  5. $WIN = 0;9 H, r# A- i7 t, @( j1 c$ p
  6. ?>: G# A' ?9 [% L, j& J; O
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">5 p; w8 T+ X- O0 r" ]8 x6 r
  8. <html xmlns="http://www.w3.org/1999/xhtml">0 `0 \+ L1 i7 S. N. P5 p9 o; n' e
  9. <head>8 E5 E0 c" }# {) p3 ?, O
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    + i5 ^* ]: M6 u! Z% Y' r* ~
  11. <title>UTF8 BOM 清除器</title>
    3 e0 ?$ K7 h( G- m# V( D
  12. <style># o6 Z. L7 N9 J3 u, o3 D
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    9 N- U% a- D: ^7 ?* X" ~% y2 S
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }; l( ]3 e0 o1 p6 E' F3 v6 u
  15. </style>
    % Z  L1 B# L' @: Q. ~- h- N& H5 C
  16. </head>- i! f# \* @5 R! w6 L
  17. <body>
    ' u. c7 C! s; f9 k% z$ i6 n
  18. <?php
    3 {+ p) q, N9 A; M5 ^# U& F) G
  19. $BOMBED = array();" R( p1 D9 F; ?
  20. RecursiveFolder($HOME);2 y: w' A$ C) S$ x0 X
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';7 I2 V& k# N7 f- H2 z' \# g/ H: I
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    " v9 p6 s! \* X5 x8 m
  23. echo '</p>';5 |* ^0 e3 G1 }
  24. // 递归扫描, I3 w8 p& U' y' k- t. y8 f2 D+ a
  25. function RecursiveFolder($sHOME) {
    ( d3 W+ o- I! O9 J) U
  26. global $BOMBED, $WIN;
    6 s5 J8 G2 }, e( N" f6 E
  27. $win32 = ($WIN == 1) ? "\" : "/";/ `1 t; r+ _  \' J# m
  28. $folder = dir($sHOME);  O0 Z1 C3 V8 p* S% c& p1 u
  29. $foundfolders = array();
    : A0 s3 m' E5 y
  30. while ($file = $folder->read()) {
    $ f! J: @7 l0 D! H5 W
  31.   if($file != "." and $file != "..") {) }0 G1 x0 U, @& |3 {
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){8 K) I) D) a6 Q- x7 S
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;# o8 _/ ^/ f! N. n+ m+ |
  34.    } else {$ w) N- @* s2 I' E9 a
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    " q2 x: v3 M- n6 |
  36.     $BOM = SearchBOM($content);3 U* _& U  g' F7 r
  37.     if ($BOM) {
    3 |. e% |2 P- k
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;! U" b# A/ q% j" A  w
  39.      // 移出BOM信息
    % V9 Z. r; L" j8 J- f& V
  40.      $content = substr($content,3);
    . X( s, L* h6 W0 I4 J. h4 g4 N0 f
  41.      // 写回到原始文件& f0 X- U5 f" k$ U
  42.      file_put_contents($sHOME . $win32 . $file, $content);6 p' f7 Q. A+ U
  43.     }  J; c+ o4 @* |: y# i
  44.    }8 s9 ^7 a' m& @3 s
  45.   }
    2 ?$ D+ x3 Z5 L$ @, [5 V
  46. }
    : s" ?/ d5 y/ {, O0 `8 e
  47. $folder->close();& c" i5 K+ `8 F3 Q
  48. if(count($foundfolders) > 0) {* V1 l" A( g8 e; d! _
  49.   foreach ($foundfolders as $folder) {" {" T3 `) x" f! \6 r
  50.    RecursiveFolder($folder, $win32);: k4 ]2 p9 a# G# k& h$ i
  51.   }
    : y, E4 r! k0 Z, k" c! L
  52. }1 d! Y: P. U; {1 z% L  V4 X, K, w
  53. }6 |- H' \0 p% k  Y) k; Y
  54. // 搜索当前文件是否有BOM
    4 J! a1 o8 L) S0 c- K
  55. function SearchBOM($string) { 7 K( x$ ^' D; I( z* l7 v9 _- ~
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;$ R8 U5 [- x+ @8 Z4 j3 F
  57.   return false; : k4 D' n) p: v- S" t" e
  58. }- d: M- O# Z: Y
  59. ?>- S& o3 G+ v4 g% _0 e6 m# n
  60. </body>$ ^1 @6 O: Z- M+ M/ V" \
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!. L3 w- a" s4 [- a* L# C  j  k" \* B
$ y( p& Z# W1 p2 b

本帖子中包含更多资源

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

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.