开启左侧

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

  [复制链接]
62785 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  % Y6 t5 Y+ E0 }% ]( M! k. q
' o' }+ p* |; h7 |
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。" x- U) n+ x  E6 l4 C3 i# D

3 M* t# q* ?$ Z; _+ M  M" w: _它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
  R4 ^3 }! f4 U5 P( p$ H: L; N9 f4 S+ i" b2 |0 c" T% u
对于一般的文件,这样并不会产生什么麻烦。
7 F' i" l2 p. L8 T. c
6 n: [. z9 s" V0 K8 O& N- h但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。3 _; y0 G( H/ ~& q3 U6 R$ S

/ ]$ c: ^6 \$ \7 w根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
9 ^! U# ^# c8 k5 g9 o" M4 U9 @6 y/ T) f# A$ |
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
* q5 c7 v$ G1 K, K* |3 N1 _% B: A3 R% A5 e! E2 `: J& g
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
, h9 @1 @0 P! }1 m$ d& `: W  L0 E
! U. B/ E8 B8 B$ p: z. }  ^然而文件比较多,又想偷懒下,使用下列方法来实现。  
5 m. m* O; m8 T. S$ C+ N* q* Z
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
1 h, T! n( [: H% H" w% T
5 L; _8 E: C4 ~5 s. Q+ j- g0 r; Q- d+ e1 w
  1. <?php
    2 m# P4 S, c6 c4 y2 f' N
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)4 p5 o$ ?  L  h' V$ G
  3. $HOME = dirname(__FILE__);8 |' S# ~2 V+ m8 j
  4. // 如果是Windows系统,修改为:$WIN = 1;
    * r- ^7 ^) R* Y# x/ E5 q
  5. $WIN = 0;/ y  B6 z$ e; e9 f
  6. ?>. k* D- a! T( u" F" W$ D  w
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 {/ m  ~4 z4 e: e9 j
  8. <html xmlns="http://www.w3.org/1999/xhtml">8 u6 [3 o, _! c2 f/ Z0 n
  9. <head>
    % `( _( ]5 b5 A& O# u! J$ R
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    " A, y1 W" Q" Q1 u
  11. <title>UTF8 BOM 清除器</title>$ y3 g/ A& _' t4 n, I
  12. <style>! i# a3 v  L( K3 }  ^; x
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }7 ?) q7 N/ o; }9 E
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    ! V, u* p) n) k( a- n2 F
  15. </style>; I0 w% O  v" \; J9 ?$ N2 M6 `+ {  f2 Z
  16. </head>
    : Y( S" r) w% w  y  |
  17. <body>
    ' Q4 X( ?  F5 h( C1 w4 S# [3 n5 C
  18. <?php
    9 B; B9 y+ _. S' C) [" D# V3 y$ z
  19. $BOMBED = array();
    5 @- o7 Z8 J4 P5 `$ u, ]
  20. RecursiveFolder($HOME);9 Y- q$ b6 Z* g1 O
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    7 }5 F$ _' A, `9 x7 k
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    - A" l! ~* U( R' R5 {$ N% d5 Q
  23. echo '</p>';
    7 R- j" M9 o* ^% v5 U
  24. // 递归扫描- N5 N, T0 Y* s. [. F) }4 b4 S# r
  25. function RecursiveFolder($sHOME) {
    . V0 m8 X- k4 T) s7 ?! y; S- ]
  26. global $BOMBED, $WIN;3 H& Q$ y  X+ w' b9 R" o: i
  27. $win32 = ($WIN == 1) ? "\" : "/";0 _. D3 ]7 g$ D+ g/ ?: r+ j
  28. $folder = dir($sHOME);
      a/ A1 {0 o) x) n
  29. $foundfolders = array();( d* g  u* K8 d3 P
  30. while ($file = $folder->read()) {4 U" H7 O' c$ ~$ I+ `
  31.   if($file != "." and $file != "..") {
    ' r  B( f- y8 o
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    - N! g4 P) E. M8 [* }
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;5 p6 p* O: r  E( A! j& r
  34.    } else {
    0 }# d( o( S% K" m& Z
  35.     $content = file_get_contents($sHOME . $win32 . $file);3 [% H# K0 M* f/ h3 L
  36.     $BOM = SearchBOM($content);7 J1 e/ q2 v, U/ F% J0 j, N
  37.     if ($BOM) {
    1 Y4 t2 k( v. ^0 I' m7 r& n
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    8 r# r( v% K4 Z2 K' v  U0 S/ Y3 x
  39.      // 移出BOM信息
    - _  c+ n8 B+ J
  40.      $content = substr($content,3);6 a' C4 {+ r" p6 F9 G9 t
  41.      // 写回到原始文件- j8 u2 \+ X8 T9 d% Q
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    $ U' Y* N) p& N: i
  43.     }3 Y2 n, d1 a$ |. `0 ?* w% ?& Y) r
  44.    }4 q, F9 n/ I# l
  45.   }
    3 A5 p  c8 A0 K9 G3 C6 K( D: k! T% S
  46. }
    ; s$ v; t8 [" F7 z, H% K. }
  47. $folder->close();# f1 c& K) p5 j; H3 m: P. K
  48. if(count($foundfolders) > 0) {- A6 t: ~  a) M1 u
  49.   foreach ($foundfolders as $folder) {( a. c8 u2 C6 q' f5 a* k8 [
  50.    RecursiveFolder($folder, $win32);) H/ W# j3 x/ b8 g5 d* A0 k
  51.   }
    / ~1 F2 a6 V; A( N0 m( Z
  52. }4 {/ M# \7 Q5 Y
  53. }
    ( ^1 ^  i, U) `
  54. // 搜索当前文件是否有BOM$ N& L" I- [' B; n/ h0 o
  55. function SearchBOM($string) {
    % q2 {+ k) [% N) Y/ r1 |1 I
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    4 g* [* U0 M: F- o; W! R& V6 m. u7 O
  57.   return false;
    - U, ~" w; o$ D; o; I
  58. }
    : A0 n# Z8 T3 |! V; g/ |& J& M
  59. ?>
    5 N, C( t' |* z; O. P6 m) r3 S4 h
  60. </body>* U7 q% ^% @8 s8 [7 X$ U. S( ?
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!; \# I$ S% N- H8 |6 q
7 V  m% m4 n  W. n1 T) J

本帖子中包含更多资源

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

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.