开启左侧

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

  [复制链接]
67872 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
! R1 e5 v% e2 ]; N. Y: Q3 u' d& k& u# L1 D7 J! K, d( @4 f
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。4 J* X& u* @$ S4 B; H
/ }! s1 ]  C- |
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ ?, j2 M4 C" A0 {2 T3 N1 P0 i& e" D; B! n* _- D4 o1 d# O" D
对于一般的文件,这样并不会产生什么麻烦。# v  [/ g4 a# \

: N1 D0 H5 ?0 a2 b  {  G( B但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。; G  W6 y* W1 j: c" O/ z) J6 F0 D0 |
& \' F9 P: F8 k# P" R9 W8 B
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。* b+ z1 @7 P" w& R9 n

8 h; j) i( ]4 ]- M( M由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
1 ~) H) f3 q( \8 Q- h
" E& ~; g# V2 D% x5 a' E/ b直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ; Y) X8 {) U9 |7 Q" m! d
" h% S. e( _, V5 z
然而文件比较多,又想偷懒下,使用下列方法来实现。    j) M3 D& T/ j" Z0 b) J7 F
  N* {9 x* ?- e* ?/ B/ M
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
& V+ o/ x/ D, M6 U3 X1 B0 T" T8 u. j) r; @4 f3 A. ?
1 M* H6 B7 [& s  P- M. ]
  1. <?php
    7 S* x" Z0 w* f+ r! V! L! a# ]
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)& c1 m( I; C2 c1 g2 g1 W6 _7 e
  3. $HOME = dirname(__FILE__);
    % X- \/ X- F4 {! S' t
  4. // 如果是Windows系统,修改为:$WIN = 1;
    2 U- o- O8 u1 |5 T  n2 g4 Z
  5. $WIN = 0;2 k: M1 L9 Y$ [5 @# a* A3 p
  6. ?>7 {% \" ?( l% T! i, J
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    : Y+ u- c( @4 M& t% J& ]5 T
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    ' i& u! ~& h; i& G/ r% [
  9. <head>
    / @6 ^& _! x: e2 y: i% P
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    2 Q! X9 C  Y$ L- ?5 g2 K, c( ~
  11. <title>UTF8 BOM 清除器</title>( `! t7 T2 `+ E3 a# w4 B9 L" P
  12. <style>
    ' t5 C7 y1 \9 I+ T) J
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }3 F0 r; R, z0 R$ r- P
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }0 D* }2 M. Z5 O- t+ ^4 j+ n- K
  15. </style>5 a9 j/ P0 s  r# N3 G
  16. </head>
    & q' M. P# `: p* Y- d0 ^
  17. <body>0 F1 w8 V6 m( R1 `
  18. <?php
    + w$ D$ i9 @9 R( z/ N" I
  19. $BOMBED = array();
    : R$ ]. r6 F* @* Y
  20. RecursiveFolder($HOME);. v/ h/ @9 [9 `+ i
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    0 {  s. W9 M; ~' A4 w4 G, b3 M$ R
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    7 _/ d  ^* |$ N: f
  23. echo '</p>';
    ; P0 ^- D, A0 [
  24. // 递归扫描
    ( K. G0 e: A9 u2 s
  25. function RecursiveFolder($sHOME) {
    8 s: d3 D; r. G9 K9 ]/ n% N
  26. global $BOMBED, $WIN;3 J5 ?) N/ r; i/ A: }6 Z( d
  27. $win32 = ($WIN == 1) ? "\" : "/";& b# ^# ~5 \' I* ?: Y8 q, R4 I
  28. $folder = dir($sHOME);" \9 O  I8 d( r$ H8 ]
  29. $foundfolders = array();
    ; }9 o& M- G# i, E
  30. while ($file = $folder->read()) {
    / C0 o# [4 X6 z
  31.   if($file != "." and $file != "..") {
    0 x# x; |8 F% {; V, S
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){- q4 |- u1 J/ d6 g6 e+ J9 T) c
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;) O) ]# e4 i) _
  34.    } else {) X. [( P- L8 Z* T4 W" `1 R
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    # w" s5 W- q; m5 B5 ]
  36.     $BOM = SearchBOM($content);5 G# K0 M$ Z% f8 L2 ~* V
  37.     if ($BOM) {
    4 }+ R& z- I1 B
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;; R( {% s( q) e
  39.      // 移出BOM信息8 l( e0 n3 a' G7 R% L  ]  _
  40.      $content = substr($content,3);
    ; j& D& W1 E/ P& x- W8 U3 d6 s
  41.      // 写回到原始文件
    7 C9 ?! ~9 I& r- c
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    - W) }% X4 u  E7 }9 v4 k
  43.     }7 W6 L7 B, B9 h0 P9 Y
  44.    }0 a# R( Z' _. ?; K' Y
  45.   }& `4 T+ s# r* {( @, r7 [* `
  46. }) x/ H, }5 }) u3 M. b* f/ r
  47. $folder->close();
    7 z1 D5 d- W* U. Y; c
  48. if(count($foundfolders) > 0) {/ [. m- Y4 M; M/ t; F* U2 K
  49.   foreach ($foundfolders as $folder) {# ~) ]/ `2 t/ Y* [5 X3 k
  50.    RecursiveFolder($folder, $win32);7 R+ e: J* [$ j- [
  51.   }1 M) }" w6 ]% E4 O! H
  52. }' E; m- j+ u( ^& [1 V
  53. }. B1 t: _1 H0 }, r/ \( }% b' T  v- I
  54. // 搜索当前文件是否有BOM4 E( e0 q. P+ s7 Q7 ~8 ]3 X
  55. function SearchBOM($string) {
    5 H+ {) v1 c2 u0 J& C' B
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;) @, H4 J8 ]! X. o
  57.   return false; # m# Z- P0 |8 v8 i+ |# s* s
  58. }* F' U) `9 {, m. Z0 B
  59. ?>$ S$ }, I2 N5 t( T6 r6 c: p
  60. </body>
    4 C' D# |2 m* [# A$ s# {' @
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!8 d& b% d$ e. c1 X5 ?9 ~
! A4 L0 z( ~0 F9 s: 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.