hot(稀有)2025一线互联网Java核心技能汇总+

腾讯架构师精心编制版-内部同学尊享版,(注意,不只有面试题) 非其他平台杂七杂八的参差不齐的滥大街 详细

开启左侧

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

  [复制链接]
66624 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
% E  n1 Y+ d; J; u+ @( U
) _# P1 }9 n, M' ?这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
  b, H( N7 ?" @+ u. |  o% l# ^/ e# E" J# V% j  S: g0 q
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。; _& c0 }% K* [" b

; N2 ]5 [) p% w, z对于一般的文件,这样并不会产生什么麻烦。
: j" ~, e5 v, P' I# K0 `
* E+ |8 \! C# Z( T: R' F( O) E但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
* x* {, _* e, }3 P4 r- f: V* ?- }4 `4 J
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
' K( b1 _5 V7 E0 U
* R* U6 X6 J/ v2 M9 r由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!1 q. d" M* _2 b1 J; H6 [3 w4 C

  B6 Q2 ^1 |$ Q. ^: T0 W直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   
- f' G( D9 X$ N( K3 L% _: H8 r! B9 ?: |2 r" w( V( _+ D
然而文件比较多,又想偷懒下,使用下列方法来实现。  
% }7 Z9 ]3 d$ N- Q! J& L- f; o% O1 ?- Y& l. W# }
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换- [+ e# z# x. E! |0 _9 E6 `

- J5 H. z% R. \5 t
' D$ F; k& r/ W9 F& o
  1. <?php 5 `5 Q3 t, @# T# \
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
    0 b) t! `6 `% b+ l
  3. $HOME = dirname(__FILE__);
    $ b/ D( l/ i1 W, I. x2 T' y8 `
  4. // 如果是Windows系统,修改为:$WIN = 1;! K3 Q/ g! u7 k( T! b! g$ l' x6 H
  5. $WIN = 0;
    ) m7 J/ @  c8 H6 H+ w
  6. ?>
    $ a4 z, e: V4 n* [- _& s0 x' c
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    + L+ F+ V/ U4 k! b4 ^5 }
  8. <html xmlns="http://www.w3.org/1999/xhtml"># ?/ g5 ^9 k$ y( ~/ s
  9. <head>
    % T8 c. b2 a8 }8 F2 @
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    # d" l7 }7 F' g; ?6 w
  11. <title>UTF8 BOM 清除器</title># `7 l0 f2 y- X. B/ t
  12. <style>
    4 J5 s! k+ j' f4 c' u
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }; g. T: A1 \6 T2 {4 ~, e8 T8 }
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }9 i. e2 Z5 h4 o# Y" J' n3 l
  15. </style>
    8 |7 B  H/ j) R
  16. </head>
    ; D9 u8 f" A' Y# ^: A! u
  17. <body>
    # X9 b3 I, V+ f5 P% F7 l
  18. <?php+ }# z& `2 A% s  W' C6 @# }7 x
  19. $BOMBED = array();
    & O  y5 g4 L% G) T# a
  20. RecursiveFolder($HOME);" V. G6 ~& `, g/ n, ~* }
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    0 r1 [& [9 d2 T1 _) y2 p7 X+ z! v# p
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ; j/ {- f( k) c/ I! c
  23. echo '</p>';
    5 E& t/ _  v* @: H$ u& R7 p& U% ?6 @
  24. // 递归扫描2 ^* b9 A- \; }8 c; M. {
  25. function RecursiveFolder($sHOME) {: P+ M0 E6 H7 y6 X9 @6 F) P4 H( B
  26. global $BOMBED, $WIN;" t) d+ s( w/ M* F0 d1 ], {
  27. $win32 = ($WIN == 1) ? "\" : "/";) N5 n7 a) _9 }
  28. $folder = dir($sHOME);
    : D0 S+ S, J& R# y( \; P7 V
  29. $foundfolders = array();
    ( v* K" e# N5 n. `% }. ?
  30. while ($file = $folder->read()) {( W# T! _9 b( B3 [. @( i
  31.   if($file != "." and $file != "..") {
    8 n5 q# c+ [! x) S% X2 k  N/ C8 Q: Z
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){, l* ?' @3 b4 q: n" ?& }
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    : f1 w" T. [' }# ^9 [
  34.    } else {
    # f5 l# M' X& p/ l$ O/ S! [6 c
  35.     $content = file_get_contents($sHOME . $win32 . $file);  g4 I: `- b" K4 L9 p5 u" H
  36.     $BOM = SearchBOM($content);5 {" T$ F& V, o' b, F
  37.     if ($BOM) {
    3 E* k3 C- Z. J7 \7 o. J
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;- E8 U9 p2 o) T( N3 k; N
  39.      // 移出BOM信息
    : g8 }2 x4 J2 e3 m! E! V! S5 Y% V% ^
  40.      $content = substr($content,3);
    2 t+ L- x, ]7 \  i+ _1 d
  41.      // 写回到原始文件+ i; `, d+ |* v2 K! k1 H
  42.      file_put_contents($sHOME . $win32 . $file, $content);- ]3 `  Y0 ]# o. r% V# s6 S
  43.     }* Q+ Q/ l* E$ I; n
  44.    }
    & s  {& L: G9 b! b! E9 ^3 H# }
  45.   }
    ; l' A. a* J4 B* K  q5 D( P) K
  46. }
    ) H/ i+ Y" W- q4 W" f; e
  47. $folder->close();
    9 k/ o, U; [' Z% o" W* O& p; }6 r* x
  48. if(count($foundfolders) > 0) {' ]" R$ D( p/ U; i
  49.   foreach ($foundfolders as $folder) {3 H- N8 R: q8 \2 @5 r
  50.    RecursiveFolder($folder, $win32);6 `$ M! ~6 l" X9 k, h6 Q7 R
  51.   }. [8 [" j  b( d. }. d' a
  52. }
    ) F2 o- x4 V! y: j  O; d) C
  53. }1 }. B; n: y/ O/ ]( D
  54. // 搜索当前文件是否有BOM) X7 g3 |5 B. r" W7 q% E* j/ h
  55. function SearchBOM($string) { 1 d8 b- M* Y2 H8 _' i  O
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    8 w) X* }  F. C7 c2 u& q/ A
  57.   return false;
    9 S6 e9 P' u3 J7 U4 P& e
  58. }
      @$ W2 x* q; b6 ]' S7 ~3 n
  59. ?>
    3 R, U% [1 J. p; h4 Y. `' F
  60. </body>
    . q/ ]6 J! r8 f$ }
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
  C/ j$ e2 ?' q3 C$ b* F6 z" W- `; Q+ k, P+ V' f% z4 f

本帖子中包含更多资源

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

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.