开启左侧

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

  [复制链接]
65805 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
) [- C' d7 ^/ |# J9 e5 I6 B3 M% [! y9 d  T; j  R5 D$ i, `: d8 L
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
4 s3 c0 Z/ V& ?, z( L5 m& Q0 p0 e$ }" B
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。3 ]& [; a) I8 {: X8 P: U
" n! A+ D: X5 b6 X# j" Y6 Q
对于一般的文件,这样并不会产生什么麻烦。; k  g% ~5 K: M8 X
5 F, c0 z, B: v) d% D5 p0 V8 T# Y
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
5 v0 _% y' M7 {- H: z
9 o" `/ r0 N* n3 A4 @9 r根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
, V& C/ Q" w9 i- _8 [3 B3 N! a( X0 A, c
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
' L$ R1 T5 T; Y$ j( {# u3 n- L; T$ Y, }- t$ |# B
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   , h! |# j4 Y( N  I9 n1 h9 v
( ?6 z% h( x9 q$ b, K
然而文件比较多,又想偷懒下,使用下列方法来实现。  
9 h3 Y- ~) |# B
2 a! A0 L4 x7 P: g, v% N将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
6 u0 r! U9 B: p7 j9 P/ F7 U4 {
; }5 {- P  [4 X" Y+ c, J) R' Y) \  T, V
  1. <?php
    4 R! k! B) d* V5 R7 H" Z$ i6 Z% Z: B+ O
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    / O8 t* c- V* n' o4 |
  3. $HOME = dirname(__FILE__);
    ) N& r: a# N7 W. i) i# A3 h# `
  4. // 如果是Windows系统,修改为:$WIN = 1;! W2 P8 u- ~$ K1 `
  5. $WIN = 0;: q7 w! Y1 B2 |# C' @  f
  6. ?>5 I2 R( ]) N( `. p0 O7 g
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4 q3 Z' p( |( h; B
  8. <html xmlns="http://www.w3.org/1999/xhtml">- R! ]+ L+ L4 x; a: ^
  9. <head>! Q$ k  c8 x. [8 k- U) O
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    * `4 T6 `; E3 K4 V
  11. <title>UTF8 BOM 清除器</title>& [+ [. w, x2 x: P
  12. <style>
    0 B, F% M. S- }+ ^5 B' @, `& L' ~
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }) d  L" l0 J1 m8 j
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }, B1 M4 D6 V" j0 n: |9 l
  15. </style>$ F6 ^" ~% V# ?  K$ ?1 e
  16. </head>& _: h0 e2 T* Y0 {) Q& X
  17. <body>
    : q2 B8 T3 N1 D# v, }( K
  18. <?php2 ?% V* n- q3 N$ f! Q
  19. $BOMBED = array();- v* ]9 \; \0 w% @
  20. RecursiveFolder($HOME);
    ; B* z- z$ u$ S6 [; D
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    % c% F  F0 `1 ^7 S" U: y' O
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
      u* W: Z  V7 |; {/ q/ {
  23. echo '</p>';8 Q$ U7 V$ T* M
  24. // 递归扫描
    2 j, z2 ?/ h$ _3 C
  25. function RecursiveFolder($sHOME) {) n! \# n, g, b  g/ [" d% Z
  26. global $BOMBED, $WIN;/ R5 O" Q, C/ Y% f) Q
  27. $win32 = ($WIN == 1) ? "\" : "/";
    $ @3 U, I8 y5 N' r" ^. j  p
  28. $folder = dir($sHOME);
    ( ?3 P3 r" _9 q9 [) }) B
  29. $foundfolders = array();. L8 M  k! D. p
  30. while ($file = $folder->read()) {
    + v( H# B- Z, F
  31.   if($file != "." and $file != "..") {
    , `" ]0 [4 a; \/ E. c6 @
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    & ~/ H5 N6 \: u9 W/ L- ]% q
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    ( Q+ v; l  N6 @5 C$ v
  34.    } else {
    0 `% p( C: V$ s7 ^9 K9 U1 V
  35.     $content = file_get_contents($sHOME . $win32 . $file);. a' e8 G) H* L2 K: Z2 f
  36.     $BOM = SearchBOM($content);
    1 W: k* }4 L9 Y
  37.     if ($BOM) {- x" c2 d7 ~3 ?2 P6 ^. e
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;( {! M' t2 @9 f/ [7 e
  39.      // 移出BOM信息
    7 \& y- r5 @# O# X
  40.      $content = substr($content,3);2 B# L5 o$ Y  k
  41.      // 写回到原始文件# ^- O+ \: u! w' ^( G; h, ?4 M/ o1 p  B0 O. L
  42.      file_put_contents($sHOME . $win32 . $file, $content);% G4 `, q5 }1 ]5 C% D" S
  43.     }# f" b( w9 F% R5 D
  44.    }: q3 s6 f  S* o& G' x2 i3 C' _# p1 R
  45.   }( J  H2 ]. y/ H4 I6 d- S
  46. }1 K, r' C& I& `# Q1 R8 f
  47. $folder->close();
    % u  _" B* ^6 Q$ C( j, f, y4 R, n
  48. if(count($foundfolders) > 0) {
    ' n9 a, I: z3 V: s
  49.   foreach ($foundfolders as $folder) {# |. m9 @$ \$ U! e
  50.    RecursiveFolder($folder, $win32);
    1 n. q. ^. e- p3 \& n
  51.   }
    - W: k0 g$ z" g$ h# H! z, d( r- n
  52. }; |! J4 U! o( i8 T4 [: ]& f/ C+ H
  53. }
    ! n% ]7 A( ^0 }9 M
  54. // 搜索当前文件是否有BOM) R; I; k' J3 ^& f% j! S) e7 \
  55. function SearchBOM($string) {
    5 o! \+ C5 Q. k( J. e4 R* N1 [0 {9 ]
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;9 E: `2 s  v2 P, Y
  57.   return false; 1 ^8 K4 `( f$ I* _% h2 U: A
  58. }
    1 q% i' c# E, V# \) d
  59. ?>
    ' |1 N$ B5 g4 \' o- Z: }
  60. </body>
    : j+ \- v% i# a4 m  }  ^
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!0 J1 Z" f" K- ^
7 Z1 w9 q1 x: ?' O

本帖子中包含更多资源

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

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.