开启左侧

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

  [复制链接]
67319 115
cx 发表于 2017-11-21 21:37:41 | 只看该作者 |阅读模式 打印 上一主题 下一主题
模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。原因是页面的编码是UTF-8 + BOM。  : y/ m/ a7 b6 a$ P3 n: U3 T# v/ C
2 {4 V5 J. M) [) f
这种编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。: K- s  b1 w& p6 b: v4 j5 q: a5 l
% [  V0 D" e5 H: G/ H3 R+ M
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。3 n* a( q% [2 M- b% K
0 Q2 k8 Z( x/ g) M
对于一般的文件,这样并不会产生什么麻烦。
- l5 n3 P: _. D" w" _% O7 u7 v4 D
但对于 PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。$ O) L# v2 h( t3 p# z
2 ?* a$ F' M' p8 f; R
根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
7 F$ \. s9 }+ m3 r1 @  b" k( E. Z
! ?% G5 Z; ^5 U! O. x由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
; q& y$ c: m) I- [( ?4 n" d: t$ j) p! Y( p
直接notopad++ 保存为无dom格式 (格式-》转为UTF-8 无dom格式)   2 [4 P' P( ?5 J/ s
3 M4 `$ F+ M3 {, ?1 |1 V
然而文件比较多,又想偷懒下,使用下列方法来实现。  
1 y6 z2 J# Y/ a; v  d) E' N+ V6 Y3 G' H/ A3 z0 c) [+ z2 ]5 |
将一下代码保存为a.php文件放到根目录下,执行一下,即可自动完成转换
3 q) Z- I8 C& Y: O
' @+ N- }& f5 Q/ V& E  V' n; C6 l7 N/ z7 Q4 R- `4 P, e
  1. <?php ) f6 x5 ^9 i1 e2 b! O/ R" K2 {/ {" V
  2. // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)8 n3 \0 K2 g7 \+ f
  3. $HOME = dirname(__FILE__);4 n' N7 \/ {5 e6 m. i
  4. // 如果是Windows系统,修改为:$WIN = 1;
    5 X( D- a9 J2 Y7 v- B7 G# X" f
  5. $WIN = 0;
    + a( O6 d' G! n2 r: c$ x( i
  6. ?>0 N. n. g9 v7 W" j9 A4 z
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' }; N  n' {. a  j
  8. <html xmlns="http://www.w3.org/1999/xhtml">
    * u- F" P% o% z! A8 }
  9. <head>
    % T& {6 A% Q" }0 e# k/ r* k
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />! W) j( a! J5 B% A1 {
  11. <title>UTF8 BOM 清除器</title># F) {. c7 k! o% U# Z4 F5 n
  12. <style>+ `, j- l/ O2 F2 f* E& t
  13. body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }5 H* d, Q1 K! h  x7 }: W' o9 i& v
  14. .FOUND { color: #F30; font-size: 14px; font-weight: bold; }- V+ R& m$ |# v2 b3 {
  15. </style>1 S3 T2 w! a) v) m! r7 K9 W
  16. </head>  u# l7 F4 `' @+ @) w& I
  17. <body>
    : ?$ G8 S. B7 j
  18. <?php
    " `5 v* F, i& n! Y: ?6 F
  19. $BOMBED = array();
    7 @+ h+ J1 J$ s0 I4 Q
  20. RecursiveFolder($HOME);" q' o4 Q9 D3 V0 ?
  21. echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    + l3 `) |$ K" m$ Z( _. u
  22. foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
    " z6 q: y- p) s# H
  23. echo '</p>';/ |" a8 F0 Q& `
  24. // 递归扫描8 b  Y) ?1 J4 g, m
  25. function RecursiveFolder($sHOME) {
    , C& ^9 m0 ?2 k6 u9 X) m  N
  26. global $BOMBED, $WIN;& `9 f* n2 ~0 {2 o3 ]$ N
  27. $win32 = ($WIN == 1) ? "\" : "/";. X# k4 K4 e. o6 K$ }  l1 Y
  28. $folder = dir($sHOME);
    / v" t' T4 J+ `7 u
  29. $foundfolders = array();
    2 o% Z+ D! \8 r& O' u, I+ H
  30. while ($file = $folder->read()) {
    - j& p( V/ Y- D  _1 z2 p
  31.   if($file != "." and $file != "..") {
    / U; b# m6 E( ~5 J$ o) a, W3 M
  32.    if(filetype($sHOME . $win32 . $file) == "dir"){
    3 L4 [) o" {5 O( C! S  \: H2 `
  33.     $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
    : c& ?* |7 b! w
  34.    } else {
    % N3 B# k  p3 ^) w3 _
  35.     $content = file_get_contents($sHOME . $win32 . $file);$ i4 N* y# Q2 V, b3 _% C2 L
  36.     $BOM = SearchBOM($content);
    ; {8 t) J1 T) @8 p
  37.     if ($BOM) {
    + _1 H" p9 K, [# y5 m
  38.      $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;2 A6 r/ s/ l" r6 d% C
  39.      // 移出BOM信息
    9 n9 o2 e% K7 Z; o
  40.      $content = substr($content,3);
    3 l- P- d5 m. Q9 S  d# R/ c8 N
  41.      // 写回到原始文件. P3 i/ n9 S0 E
  42.      file_put_contents($sHOME . $win32 . $file, $content);: B# V3 F/ l) w) p; N
  43.     }
    ( b  _; o9 w- o, o4 l
  44.    }
    / W8 ~1 q8 e$ Y9 T
  45.   }' J, V1 u. b7 o
  46. }: X1 W+ P" I- w: H
  47. $folder->close();: q$ r# o0 z' h( a* v# V7 \( z
  48. if(count($foundfolders) > 0) {
    . ^+ V5 n) e2 [; I# e
  49.   foreach ($foundfolders as $folder) {
    ' y8 B/ Q, Z+ _* m& p+ J: Y
  50.    RecursiveFolder($folder, $win32);4 \& b; r2 C6 k4 m( r
  51.   }
    3 L8 Q4 B! U4 t' q+ b
  52. }
    8 q# L8 r/ B) y3 G% J8 d4 @
  53. }! U1 Z- R, w/ l8 N( {* M* K! J5 c
  54. // 搜索当前文件是否有BOM+ J; h- o, t/ K/ _8 i
  55. function SearchBOM($string) {
    ! \! r$ a# e, p/ l' [. Y
  56.   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;4 x" B" W% M1 g* A4 k
  57.   return false; ; {. k/ Z) S/ \: o0 ?* O
  58. }* e3 c9 ]" [* g
  59. ?>7 R+ A3 X. ~# u0 b
  60. </body>
    5 y7 Z% l5 X3 N8 i, N
  61. </html>
复制代码
这个管理员我已经测试过,确实好用的!!!如果懒得去制作文件,就下这个附件吧。用完再删除即可!9 V' c, G, x3 y

' u' s8 g/ u6 m& d% ?. u

本帖子中包含更多资源

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

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.