开启左侧

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

  [复制链接]
66012 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  9 y- r0 {8 ]  G- u) T
" d5 N6 p$ L. _" T5 D6 j
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。/ c+ z, c3 y9 m" E! T$ s' P1 {
: M+ R! U" l9 p; b6 t
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
' g' p1 {4 z+ D
! K. u2 ^* G# g, q对于一般的文件,这样并不会产生什么麻烦。
7 \0 n6 G$ {# n/ a
$ t9 b% t  h. U  c3 A但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。2 ^8 f- z0 O+ x1 _+ {

5 s8 J( F/ a. b  \$ y) A" D根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
2 n& n/ T* o0 n- i' `% ^0 C( A# a
# Z. Q+ I8 y6 k由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
  N* P$ F" L! v* b$ H+ E
0 d8 x* G9 @6 V& F! c3 h8 j. L$ Z直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
" H5 U( q7 d7 b6 e0 u  u; U
' e- @% h, A. D0 |7 U. \5 A4 W4 n然而文件比较多,又想偷懒下,使用下列方法来实现。  
8 t) G' ?8 g6 ~+ G/ ^1 D" _
9 X& z; q8 w& L# O5 H将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
( P( P4 H" t/ F+ j* p  M7 v+ D3 J0 X
  V% K6 @" {  p( ^" y* \  p
* O0 I0 G) V' V# B8 i
  1. <?php + g! f" @) h' V2 k+ i  t& i
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)7 L4 r' _, b( E3 `% |7 C, i) K
  3. $HOME = dirname(__FILE__);% d% ?( @/ P2 O
  4. // 如果是Windows系统,修改为:$WIN = 1;
    4 u; u0 F; J) p) t
  5. $WIN = 0;
    * m9 ~6 P5 k' |; M5 r9 ~
  6. ?>) P; `* `: h# Z, z7 O
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">. P, l' i' m# B& z, ~1 F
  8. <html xmlns="http://www.w3.org/1999/xhtml">! K6 d3 q* t& n6 W6 L
  9. <head>
    # e9 n' B9 m  D3 D) e
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />5 P$ e! G' C! X
  11. <title>UTF8 BOM 清除器</title>: O/ T$ x0 w+ w: {/ I0 c
  12. <style>
    6 z' _3 \& Z$ ~- i
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    7 X9 K6 E! s9 }: g
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    8 z+ O0 I* ~( h# M6 q' h
  15. </style>) ^/ b0 N# E/ }2 l+ R: k
  16. </head>! `5 o" ^4 Z* b; |6 L, V4 c- I* b( J
  17. <body>
    # Z' z) z( X2 ^+ i
  18. <?php
    8 X7 ^0 y$ W/ R" O; s8 C5 O2 m! j
  19. $BOMBED = array();
    6 x. r$ q* |% y2 G* ^/ l& t0 D0 ~
  20. RecursiveFolder($HOME);
    ! k; `6 [! X8 p
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    3 H# ^/ ]9 N! K. \# P* {
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    % N" N& [' o5 I( m1 F
  23. echo '</p>';0 c( f& Y4 F- x' f2 S
  24. // 递归扫描/ r9 v- F" L6 s! e6 g1 {
  25. function RecursiveFolder($sHOME) {: O; Y  N& C/ z1 Y) q+ P
  26. global $BOMBED, $WIN;
    % b7 O/ A0 r0 p  J' e4 ]1 r
  27. $win32 = ($WIN == 1) ? "\" : "/";6 P  W9 x2 W1 W! p( @
  28. $folder = dir($sHOME);/ z. ^# J6 m5 J
  29. $foundfolders = array();9 E! o. S- C" L
  30. while ($file = $folder->read()) {
    % k& I& D( m% o4 W& }& f
  31.   if($file != "." and $file != "..") {, H$ G: b- q; w) H. D) X7 I4 A
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){5 g# {0 u, C) f2 V- I" {
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;' [* `* U0 ]! [; z7 r
  34.    } else {1 c4 m1 s: a4 S3 \+ g# h( d3 O6 O
  35.     $content = file_get_contents($sHOME . $win32 . $file);' r. i  G4 H4 D1 z. }3 B" S
  36.     $BOM = SearchBOM($content);' A3 j0 s9 w* a
  37.     if ($BOM) {
    + e" d. P; A' w  r5 }4 m
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    ; L& X0 R$ R  e$ N6 m7 }3 \+ @1 d
  39.      // 移出BOM信息. x& \( `" r" s1 k& O3 b
  40.      $content = substr($content,3);/ m( Y5 \+ ~3 y- W. D. d( j7 l* Q
  41.      // 写回到原始文件
    * J) S; W1 @. j4 j# p; c6 \3 |) x
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    # u. J5 l; |% t0 N0 Y5 f) J
  43.     }* R+ C' h. l  v8 v! s* ?
  44.    }
    3 Z0 U* t0 ~" L9 r+ Y
  45.   }$ z: X2 f0 ^/ \# E
  46. }
    8 `4 T6 f- M. r/ Z
  47. $folder->close();, y( u5 z' D& d8 U' H
  48. if(count($foundfolders) > 0) {- _  G" m+ x; V: F7 c" F
  49.   foreach ($foundfolders as $folder) {
    3 E' T; J  Y. g& r4 t: c) s+ w
  50.    RecursiveFolder($folder, $win32);
    1 l  b) E0 f# M) `$ P4 K" D5 ^
  51.   }# W6 G1 l  U' v! U
  52. }2 b4 q  O6 B+ }4 p6 F  a
  53. }
    / t, Z6 I, B1 k. N/ d
  54. // 搜索当前文件是否有BOM( j9 R* ~  [+ \, v/ x: i( R. o7 v
  55. function SearchBOM($string) { : v3 F" G7 r9 B7 C
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    $ H& T( T' H. h8 \
  57.   return false;
    " ]( c1 c' p; @- }* J8 r
  58. }6 }2 o- K1 _$ A; R. M$ _
  59. ?>2 ^# v- j3 s3 f# R
  60. </body>3 V/ W. B/ @2 d
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!9 n* n4 \3 E+ L1 e

  z% a2 _! u# I

本帖子中包含更多资源

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

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.