开启左侧

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

  [复制链接]
67106 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  / z: B, ~) K7 T& D2 ~0 u$ c9 X
4 n+ _# y# r2 n1 T; ~1 M
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
2 y, J$ v$ f9 N
+ |- p, X+ p7 B+ ~它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
# d- {: n5 U$ C' m/ P" M) m, O3 ^
对于一般的文件,这样并不会产生什么麻烦。
, {( @7 h1 l" L9 J1 }- a# ~* a4 x* S; r/ Z
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。
+ Z4 M+ r4 k; b3 r  C' s: L: t# n0 l5 C  ^1 `5 V  `' M
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
8 c# E) V+ {" |3 f0 R: o! Y( V( {, `, C* k
由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!8 j& T4 e1 C) P

4 i6 {" v% M9 F: o" G5 k: F7 I直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   0 w2 ~' O3 q5 g! ^8 G

# `/ T( p: z- n8 `+ f6 ~, m% E然而文件比较多,又想偷懒下,使用下列方法来实现。  5 L2 r2 N/ J& N( N5 h7 W& R# D) u6 k
% b9 F5 z9 @) }
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
- ^$ A) C1 |' B1 L- g% z1 ]7 w
! X$ K, `! z/ B$ @1 {: R7 L* x$ _5 @6 M, Q6 d
  1. <?php
    " m$ ]$ R4 E  W, z/ o
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)4 v, I  B9 B9 Y2 p
  3. $HOME = dirname(__FILE__);1 _9 }4 _) V% x9 b9 S) |/ V
  4. // 如果是Windows系统,修改为:$WIN = 1;
    4 O& }" D% Q2 g. ^' U5 ~9 q
  5. $WIN = 0;
    4 V9 F: M+ C0 G1 n! Q* Q: c
  6. ?>
    1 Z8 a4 m9 J) c" v+ s( Q! a. v4 n
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    / Q; w% ^% B5 N4 ^& i3 e
  8. <html xmlns="http://www.w3.org/1999/xhtml">$ s2 B! f7 X3 i9 a3 l) W
  9. <head>
    5 c$ Q: g$ L! j5 T
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /># B$ H4 S4 e) _$ @6 I3 Z1 g6 ^4 G
  11. <title>UTF8 BOM 清除器</title>
    # [. x) a# M3 H+ N. x- N( ]
  12. <style>
    ) Q+ F* z- N- `) Y3 L
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }1 w' S  j5 e/ R
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    + p( z6 V, r/ W- v+ @. ?# z
  15. </style>, ^" r' U  U9 o. _/ q
  16. </head>
    / k2 I% c$ \) f9 J! o5 N
  17. <body>
    " R; o' g  j* t2 X0 V% b9 E; k# v
  18. <?php
    ( ^* d4 Y: c- \" x4 G
  19. $BOMBED = array();
    + V$ k( H$ O: @/ J6 P
  20. RecursiveFolder($HOME);2 v3 W1 k* U7 B
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    % o/ `* {. a4 S& p: j6 Q' {, X/ ~
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    " T# a1 v' c: F' z2 R8 a: D3 _
  23. echo '</p>';- @5 j! S- r0 J0 j; T3 V
  24. // 递归扫描
    / S9 L. l; R: L2 w
  25. function RecursiveFolder($sHOME) {
    - Y% P. V) I, k, E: V' c+ a9 {
  26. global $BOMBED, $WIN;
      H5 _' m  w, i4 p
  27. $win32 = ($WIN == 1) ? "\" : "/";
    5 q0 t! B1 `7 V# z
  28. $folder = dir($sHOME);
    ! T9 A6 M( _1 U! V3 b! c- H" f" L
  29. $foundfolders = array();3 e. G# a/ x2 u) {' q
  30. while ($file = $folder->read()) {2 \+ X6 a( }4 p7 \9 Q/ B
  31.   if($file != "." and $file != "..") {
      N1 f& ]6 B3 W" K7 X3 h& T
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    5 V& z1 d" x/ T0 M- R6 ~; \: h1 o0 Z
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    - d& M# G: Z0 D. q! q+ E* ~
  34.    } else {
    7 c" I) h) V5 D* d
  35.     $content = file_get_contents($sHOME . $win32 . $file);
    ' c% Z- U* e9 B+ c( d
  36.     $BOM = SearchBOM($content);
    ) I% Q+ X4 H) ^! U# l8 e
  37.     if ($BOM) {- b* S+ @' Z1 S$ Z
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;& S* x8 c/ P" r1 a. c# F5 s
  39.      // 移出BOM信息& G$ V5 y3 N/ f3 y$ t
  40.      $content = substr($content,3);
    5 R9 A- ]$ S- H6 K5 d2 N6 E- ?: n
  41.      // 写回到原始文件
    - M0 o6 c8 }: i* N# ]5 ^
  42.      file_put_contents($sHOME . $win32 . $file, $content);
    % P: R7 v$ [4 |/ U! {. W2 M
  43.     }5 W1 M; a3 k1 Z
  44.    }. G' d: n9 m& _, {, s4 {8 R# \
  45.   }1 m( g3 @  `  J9 ~0 W
  46. }/ B# K  W# Y1 ~
  47. $folder->close();
    . m6 Q% X' [/ _; g, p3 V
  48. if(count($foundfolders) > 0) {
    ! x6 F" d4 G* e$ k+ ]: \' x$ m, d
  49.   foreach ($foundfolders as $folder) {( r) H: M9 ]+ d; k( ]' ?  o* Y; T
  50.    RecursiveFolder($folder, $win32);
    1 ^& S" W. ^. E1 g3 w/ ~
  51.   }
    / G* ^& _% _7 f6 ~: J, x4 ~& C
  52. }' o# g6 W* V3 Y5 R
  53. }
    + q9 `% a2 J7 _) B$ C
  54. // 搜索当前文件是否有BOM
    9 I0 g2 |+ P( l+ w+ {& i4 K
  55. function SearchBOM($string) {
    ( U9 S6 S' G7 D5 B1 ]6 u- |$ L
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
    8 M1 E) X5 @% t4 D; g; [
  57.   return false;
    ( u8 P/ {# R+ j4 X% J5 f8 n
  58. }
    ; |1 }( i0 s! O" l9 @2 L! S
  59. ?>
    6 ^  {5 x( y8 @9 v8 Y
  60. </body>$ V/ S- t% P5 T
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!
  e8 N, n, y  ^7 B6 ~; M4 c% i% v9 [

本帖子中包含更多资源

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

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.