开启左侧

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

  [复制链接]
59178 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  / ^/ R( j. g4 b, A9 |2 k
( A# C2 l6 h( s8 n4 D# a, \. i. B
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。% d% l) x, s4 X, S3 [

& r) {2 a% i! i. S6 S; V3 J6 c7 C它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
; B1 ]' a  `3 g; |2 Y: M" O" Q% ^6 n8 X, D+ J
对于一般的文件,这样并不会产生什么麻烦。
+ {. o; d) D+ O; O/ C5 N
" I- a8 d1 k* ^- K5 ^' u. O但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。' T* w! F* k' A4 Y
* H6 [' j  Y( d" b
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。7 B; _+ G9 S- F- R1 @" l1 A1 r

+ n9 n7 i1 J3 w. K' [3 l' n+ _由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!+ P1 q+ m- i* j

% [1 c1 s8 h0 ?5 ]5 l8 ^6 b# [直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   & g2 Y) N- k2 j  d4 r

" \* Y$ q1 Y$ X1 H% ^$ D) l然而文件比较多,又想偷懒下,使用下列方法来实现。  
% ]; g+ n' f) G9 j" G& K5 R% e& ]4 O1 W1 A
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换2 j4 G* _: j9 |
- B. ~( u4 \- k  T
7 j) c, x- t: h0 s6 m# V* f& D
  1. <?php
    ( ~# R, [# K2 E- P' o) \% t
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)7 i! l  X( Z1 ^& ^
  3. $HOME = dirname(__FILE__);* E7 ]; ?: \9 @& W
  4. // 如果是Windows系统,修改为:$WIN = 1;$ B9 V4 f" t! ]2 \4 o3 ~" J  i! v
  5. $WIN = 0;
    % f; l8 [, {' X# Z6 s
  6. ?>
    ; n* \: H; B+ {) X; L# V/ o
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    , F$ x) z1 V5 ~$ \  W) b& J
  8. <html xmlns="http://www.w3.org/1999/xhtml">- P5 s, l: a% a2 ]
  9. <head>
    & k4 q- L0 P7 r! r  p1 k6 ~
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    $ d0 _. u! o; J9 k
  11. <title>UTF8 BOM 清除器</title>
    6 ]. r0 j6 v, Q9 S
  12. <style>
    3 b* G$ _4 l$ ?, b( H
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }! J& o6 o: z( Z" |
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    9 f3 i. L6 I! G4 d$ d
  15. </style>& v1 G/ I: k4 W/ h
  16. </head>$ ~1 U/ g5 P3 \# N
  17. <body>
    : H# y+ [: i  E9 Y2 t6 y* I1 A% `7 z
  18. <?php
    5 y4 z" N) ~+ S; O* T7 b
  19. $BOMBED = array();
    : v( R1 G4 N- _7 T
  20. RecursiveFolder($HOME);
    2 d7 I  k% Z9 l# l- m. U3 ?3 M
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    & ^: i% N+ K; d* ?" L" i% {9 j2 @
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }7 ]  z7 [; I+ n  J9 y0 H
  23. echo '</p>';1 C8 S- m2 w& z/ A! @
  24. // 递归扫描
    7 b* u6 J8 u# W1 I( ^1 F
  25. function RecursiveFolder($sHOME) {
    3 \8 Q1 l- F8 Q2 c1 q8 c
  26. global $BOMBED, $WIN;
    5 O9 C9 @' B$ g5 e
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ! n7 x+ W# P/ O
  28. $folder = dir($sHOME);+ ~" [; B) y+ q' y* v. g7 ]; K* S
  29. $foundfolders = array();
    8 h; p1 e  z$ D; C4 M: ^
  30. while ($file = $folder->read()) {
    2 O% P0 _7 Z* b8 V* O% ~
  31.   if($file != "." and $file != "..") {
    ; H5 h) b) N/ W4 `! w+ O+ |* x. f; W
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){5 u! }4 Z( Q' V5 |
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;  @4 T" V) C" V' g7 a- r  Z) [, I
  34.    } else {& \' p) F& W/ \& _) }8 P( t8 C) _
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    : i. g: ]+ E2 v" @) @" S
  36.     $BOM = SearchBOM($content);  `$ }  Z! c' |" W/ V* D
  37.     if ($BOM) {
    2 ^' O( W0 m* q- E0 g7 [! s4 K3 x
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    7 D3 N, l  N1 Q, Q, r/ M: |6 E* u
  39.      // 移出BOM信息& g7 \  Z" i$ z* ~* R/ M
  40.      $content = substr($content,3);
    + j* i9 _0 F3 {
  41.      // 写回到原始文件5 U$ O4 K& E% c
  42.      file_put_contents($sHOME . $win32 . $file, $content);  h! s/ A7 p7 @7 l  G! F
  43.     }; s2 O! A8 a% |
  44.    }1 V( y, {/ v2 C$ ^" K) G
  45.   }) ^6 n! B/ h# O
  46. }4 m3 ~# u# u+ `* {
  47. $folder->close();
    " P  P+ G. ?( x* C
  48. if(count($foundfolders) > 0) {
    ; @  a# |' d- V- j0 H
  49.   foreach ($foundfolders as $folder) {
    6 U; c) ~6 N/ L5 _* u
  50.    RecursiveFolder($folder, $win32);0 B4 T& V! @: ?& [* H. f
  51.   }
    " c) E) {/ \& n; z' U, n" U
  52. }  L# I. j' q8 n! w* w
  53. }
    : H& S) n  [  N, s+ b. v
  54. // 搜索当前文件是否有BOM" M# [$ y5 i3 S" d
  55. function SearchBOM($string) {
    ; A) d* \8 }& r
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;$ j- k( h8 r9 h% u7 X* O5 j; z' B
  57.   return false;
    " U! e" T( G% D( e
  58. }3 p3 e" ]6 S6 [" Q# X. X5 u
  59. ?>
    3 s( K9 u% F6 I/ v  P. g' z/ W
  60. </body>
    1 i' Y: _% M* K& \$ r: \4 @
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!; G6 l! o* @% [' u0 c

  U: S3 G- h* I% w& ^5 H, p

本帖子中包含更多资源

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

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.