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

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

开启左侧

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

  [复制链接]
66795 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  
7 q7 r" R* W8 p- u) K7 {6 U+ S. `& ?# M
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
# N0 V: x+ v! V. I, q3 ]; {" p* y2 c" k' j2 {
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。+ q0 G0 _$ A; ?
% f5 p: y& Q, V- ^8 T- V$ Q
对于一般的文件,这样并不会产生什么麻烦。, K8 g! S/ z& F' y/ \  ~+ r0 k
5 b( @) _7 S- ~" x% C
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
, a: l) C4 p& s  E' p0 c4 f" K. u) W' e& @3 p$ G* b
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
$ W/ j  _3 G; f2 p: F+ R0 v$ j
1 n" s, b1 t, [- C& x4 l) X2 K# ~& k由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
. h% L0 k+ X* ]$ a4 X- {: ]" j( y; L- M1 ^6 Q. W) h
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   / m- B5 d% _/ ?- A1 Q" o
/ _+ s( ]" O* c( e
然而文件比较多,又想偷懒下,使用下列方法来实现。  
) g' z. K, H. w7 E# e. i! y
* W2 p/ H" o/ c+ a) Z. g2 I将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换4 n# O! q0 e# `" V' |' R, g
' i' _' d% d& p; K- N

& S4 T( _- [( g/ e5 J
  1. <?php . Q; ]' p( p/ Q; }+ a+ k" J
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)" {/ R+ y3 Q" m: k* x' M% G5 g
  3. $HOME = dirname(__FILE__);- N# E2 h2 b5 q4 B8 c
  4. // 如果是Windows系统,修改为:$WIN = 1;3 Q. y1 ]* |* m# W
  5. $WIN = 0;
    6 ?1 ^' J3 i9 D1 M
  6. ?>
      r9 q; B4 Y8 s9 R- I. b$ [
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">3 ]# K3 F0 |) I) i5 j% J
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    5 y% v0 g% M0 ?0 Q3 V5 A
  9. <head>( [% q7 q6 d8 X
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />. K- \6 d$ C  n8 N) E8 c
  11. <title>UTF8 BOM 清除器</title>$ v7 ~6 a' z: ]7 U7 Q
  12. <style>. h9 ^7 K( q* ?% `7 c
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    8 p: `6 U2 k* D$ r9 z, v
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }! G* M, o/ S' D
  15. </style>
    9 V$ V/ P3 w" C# L  c& o0 l* w! e/ a5 A
  16. </head>
    . q! p; x1 o* S# m9 o
  17. <body>" K- G9 p% Y8 @  N1 ~4 d, i
  18. <?php
    # l5 P1 _) N% W3 \) H& N+ f
  19. $BOMBED = array();
    % a* x2 V( T- o4 @3 T
  20. RecursiveFolder($HOME);
    / w# r9 \* F" [0 D& ?8 G( B$ x
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';0 m7 d0 L9 r$ w! b; B% J, Y$ B
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }  n# z, x1 J; ]
  23. echo '</p>';4 o( s7 E" ?  a; Y
  24. // 递归扫描  I0 i& j; J2 I
  25. function RecursiveFolder($sHOME) {  {4 {, `7 @5 g6 h* x
  26. global $BOMBED, $WIN;) _. |3 C* d5 C9 r7 i' v% E- m! L
  27. $win32 = ($WIN == 1) ? "\" : "/";
    ( }0 K  X: O8 L- ^- `) w1 @
  28. $folder = dir($sHOME);+ C' O" u2 v$ m8 m7 J" z7 m
  29. $foundfolders = array();' R, K2 Q' [& h3 ?% Z( t& x& N% [
  30. while ($file = $folder->read()) {
    4 `! y' G& X0 `7 b$ r5 P
  31.   if($file != "." and $file != "..") {
    - }- A* K; C9 B; I$ a2 d0 P
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){  h4 h% G3 ?$ G, C6 T) p1 b
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;. D1 g5 t2 x. Y5 X
  34.    } else {
    ; n! G) r5 J( w
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    : G* |+ ]' m8 g8 g! q3 @- A0 }
  36.     $BOM = SearchBOM($content);5 C4 K' h  K* G" t* n# o
  37.     if ($BOM) {
    ! h8 c: v8 R: b6 Q# l! U
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;% G- z% _9 v* j8 D; d7 \
  39.      // 移出BOM信息) X1 f, }. x3 N/ {# K/ y* v
  40.      $content = substr($content,3);
    ' o+ }! t& y/ F, o# c6 a
  41.      // 写回到原始文件
    ! y( r# t) d4 T6 p( Q; O
  42.      file_put_contents($sHOME . $win32 . $file, $content);& ~9 P+ A. E' P" _+ [
  43.     }
    * C4 ]" b, I  y! _1 z0 \! i- n" B
  44.    }
    - p, {2 K( ^7 I2 x
  45.   }
    0 s6 y6 D. B$ j2 |
  46. }# I  z1 m$ l/ t6 J
  47. $folder->close();
    # {+ ]& x2 i7 F
  48. if(count($foundfolders) > 0) {1 x4 l2 @8 d0 C$ P4 N# W0 g) ~
  49.   foreach ($foundfolders as $folder) {# Q# x1 X! ?4 q6 R& Q$ I0 s7 i
  50.    RecursiveFolder($folder, $win32);
    9 @7 ?* Z, }. n
  51.   }
    2 O8 Z% D  u4 K
  52. }
    7 }. }' W7 U6 X; w( U
  53. }
    7 Q8 W9 S4 Y) T* y$ \7 r& Y6 n5 e- B
  54. // 搜索当前文件是否有BOM1 N7 ~% d& K/ r; P7 K
  55. function SearchBOM($string) { ( x* z' k  ?* Z, Q. W
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    % J( Q, A: `7 T( P/ A
  57.   return false;
    , H5 I9 H- M6 f7 K, r+ I4 z
  58. }
    + `$ J: L2 k# m2 {" _
  59. ?>
    8 I# Y8 w. G+ n, z9 U! g
  60. </body>
    , M1 w( t, P' [$ U* N  o* u7 q( V
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
: N& t) Y( S4 R+ W' `. o; k' B) r6 J! d% |6 N

本帖子中包含更多资源

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

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.