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

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

开启左侧

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

  [复制链接]
67234 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  # t, V( X( F+ Z5 A0 Q

4 E8 F/ s9 p5 z& s这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
/ I9 N( Z1 M4 }/ t! k, Y* p4 s
) p+ r" S' ^* e: f它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
$ ]8 p+ ]1 ]) p5 ~; \: S! h8 M: p5 a6 \9 x6 h
对于一般的文件,这样并不会产生什么麻烦。
# L. F" K" v+ S! y) ?" ^: `& l1 f. \' Q8 p4 P% P
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。& ?2 b" m% I- [
% C2 _; W, s* b) l& c
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。- X7 }. w+ N6 F) z: C; \/ Y: p% W, P5 w

* G: G1 u. k2 u, i由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!) H% x. I8 t: W

5 H; h& p. a7 i4 d7 e直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   ( c5 v2 i- Z6 i: U

! a2 g. S* C. ~! Z然而文件比较多,又想偷懒下,使用下列方法来实现。  & m: \  k- @6 ^! M! H/ z5 i

' C& q$ F( A; n将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
5 ~* d( M  n+ a% o& F2 p# t# Q7 H, R$ J" P. \
, M8 n/ G' b. I& ]" l: F! Q6 l; l
  1. <?php
    - w1 I! M% A2 q/ e, p. C% x! I/ a
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)0 F3 q' L" f0 K; K9 Y; c
  3. $HOME = dirname(__FILE__);. z: H( }, G- Y' n* m, ]
  4. // 如果是Windows系统,修改为:$WIN = 1;6 P) G+ L$ U4 Y& A, e) ]" }. e
  5. $WIN = 0;- S+ R0 b  l# e: i
  6. ?>0 B8 S* P+ s' E5 d5 [( p5 @$ }! c7 q
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">& n' ]* @( M. ~* x: g
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    + q/ I, U0 J1 t$ s5 h, p
  9. <head>) [: r. z: Q1 c8 ]6 N& `8 X
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />8 O- A/ u0 I  X3 b& o
  11. <title>UTF8 BOM 清除器</title>
    / z! x3 F6 e4 H# v& j
  12. <style>
    1 {! s6 R- S. T; l0 [
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }+ |0 o+ x9 k$ ~
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }8 ^) ?6 v3 o! g) `& Z9 Q2 X
  15. </style>
    & [# c7 s2 d: E& O/ C: L) H( S
  16. </head>3 ]8 z& z+ P- x4 |8 l
  17. <body>
    ) A6 H( R) x- G3 ?# X" D& P
  18. <?php+ u# M- E5 G" ~3 T/ I
  19. $BOMBED = array();
    5 y1 i6 e' g0 c; _" `# w
  20. RecursiveFolder($HOME);
    * t3 S9 F9 v; J2 p/ S5 k
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';* I6 [- \1 |0 {
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    ; n7 I' |3 A7 f( {* |( r/ j6 Z( |
  23. echo '</p>';
    % \' E* U& q" v5 [' V) P7 c2 J
  24. // 递归扫描/ k6 h+ f* |7 C  c8 @  V
  25. function RecursiveFolder($sHOME) {
    & \" ^. c! V5 b7 m4 X  o4 a- |
  26. global $BOMBED, $WIN;' w+ E( l# Q: A- k- x& u2 E$ l3 y- T
  27. $win32 = ($WIN == 1) ? "\" : "/";
    , U! S8 b6 y0 S" s2 N! ]
  28. $folder = dir($sHOME);
    7 X! b- e6 R1 D7 Z5 N4 W4 \
  29. $foundfolders = array();
    ' Q$ L- m, L! V6 a) _
  30. while ($file = $folder->read()) {1 M& i# G) {4 Q; q- r) b
  31.   if($file != "." and $file != "..") {% t. a5 B- }. W: g6 B
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){5 t7 M/ O2 r/ Y( }* I( ^, I8 i0 o4 p
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;! G: v$ {! U1 X+ m7 L9 d
  34.    } else {
    ; @, E! a3 I7 X1 f4 L9 l# b3 j
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    # C" w, I  T2 z% B! y
  36.     $BOM = SearchBOM($content);
    ; F/ {! t( ?" R
  37.     if ($BOM) {
    $ @. L! }0 V( j( y( A: T7 I- ], |  E
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
    0 R; \- M/ J0 i7 k! U, ~  \, S
  39.      // 移出BOM信息7 e0 l3 S: T" S- `, D; s* \
  40.      $content = substr($content,3);
    0 T) {+ ^5 `6 n4 A; S
  41.      // 写回到原始文件8 }% C2 I: ]% t
  42.      file_put_contents($sHOME . $win32 . $file, $content);. d% J9 @  ]$ t) {+ C$ J
  43.     }! S# z8 C/ @" v  E
  44.    }* {* B& V2 k, B$ f7 p  A
  45.   }
    # e% M5 X$ [$ K& l2 i1 u  @
  46. }
    # u$ ]3 k$ o! j( W6 l0 M2 x$ p
  47. $folder->close();
    ' ^  f3 |0 [: i: v
  48. if(count($foundfolders) > 0) {/ h; x( g. S; L/ ^- m9 b# s- T. K
  49.   foreach ($foundfolders as $folder) {$ `  w7 ?# b, O9 h* I* u
  50.    RecursiveFolder($folder, $win32);
    / N2 d* G# M- `; f0 |
  51.   }9 w$ [& ]0 p& C4 e3 _
  52. }2 W2 v% @! t2 W; N1 k' [# E  L7 o
  53. }
    ) E) g% t6 t% f% n& r
  54. // 搜索当前文件是否有BOM: o- s4 s* d9 U1 X! ~5 d
  55. function SearchBOM($string) {
    # J8 E8 K  S' y# Z2 r9 _8 p
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    " `! J' \3 N. I; i8 j  L
  57.   return false; ! T' C+ Z0 F. H7 u7 |
  58. }5 O. g4 u/ G" g
  59. ?>
    7 d, ]6 L, M6 a3 h
  60. </body>
    7 q$ P! r: U5 N% a$ z1 T- ^
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!" i, V, ]8 I0 T6 H: I
0 }- i4 d0 M- j1 s

本帖子中包含更多资源

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

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.