我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > php如何检测文件编码方法
总共48086条微博

动态微博

查看: 1179|回复: 0

php如何检测文件编码方法

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-07-15 20:48:49 |只看该作者 |倒序浏览
关于文件编码的检测,百度一下一大把都是,但是确实没有能用的、$ M! C( j/ N$ |7 M/ Y5 R- s
很多人建议 mb_detect_encoding 检测,可是不知为何我这不成功,什么都没输出、4 r1 W7 f2 X, m; a/ ~" a
看到有人写了个增强版,用 BOM 判断的,我果断就无视了,这东西完全不靠谱、
% o) z& @% `0 ]9 X8 h) B% j, _最终根据PHP手册里 mb_detect_encoding 函数下方的例子,自己写了一个检测函数,# m. N# E3 j9 T
还包括自动检测编码并按指点编码读取文件的函数、! q+ T7 l2 g. z, o
源码献上,不喜勿喷。6 S. v0 @% T3 Z: \/ x! Q
网上的方法我试过没用才写的,说不定环境不一样导致的。4 p$ k& Y% {. N7 l8 [
所以万一没用,也别喷我,我只是共享想思路而已、、$ h3 P( @4 A5 c
  1. <?php0 ^0 p" o2 X9 V' ~3 F
  2. /**
    ' U$ K9 `2 v2 a1 x! R
  3. * 检测文件编码. ~: [# ~' M8 K- r: E
  4. * @param string $file 文件路径
    ' R9 c# h0 W8 Z
  5. * @return string|null 返回 编码名 或 null
    % H! ]( _0 K( Y1 B& u# c7 e1 B
  6. */
    ' p' Y& F8 ?/ s
  7. function detect_encoding($file) {
    4 K  H1 t8 J% f2 D
  8.     $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
    4 r! E* l# Y# K
  9.     $str = file_get_contents($file);
    2 E$ v9 e" Z* z) o. H0 U) J! F
  10.     foreach ($list as $item) {$ @  e: a8 w# R. q3 D! d0 B
  11.         $tmp = mb_convert_encoding($str, $item, $item);
    0 J7 B3 }7 m1 w. `" R% m: M1 S
  12.         if (md5($tmp) == md5($str)) {7 {# U) X( a6 u& [
  13.             return $item;
    % T& w& g+ s" x- W$ n- A
  14.         }
    - [5 F0 }/ N7 X: G# ~
  15.     }
    . `/ C- R" N  j/ y9 H! z; u
  16.     return null;$ L$ C6 w$ F( Y# R+ r
  17. }0 b0 E: Y6 z3 Q- R/ M9 D
  18. 6 G& h, i! q* V" g3 q7 _
  19. /**9 u1 V( n9 a6 }. X9 k' Z: i1 E$ a
  20. * 自动解析编码读入文件
    , c' @! u) V  r4 z
  21. * @param string $file 文件路径
    4 L/ F# A. `' \) \% ?" N6 t, y0 w
  22. * @param string $charset 读取编码
    1 \/ c7 H/ C" X& l- S
  23. * @return string 返回读取内容! a4 e) w) Y2 E) f" l8 Z% |
  24. */, ~6 G# f# H6 \
  25. function auto_read($file, $charset='UTF-8') {
    ! k$ O" u: J0 K" R( T% k( ?
  26.     $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
    ) }# o$ z) G& P- P( t# h6 U  W
  27.     $str = file_get_contents($file);
    8 u; E: P: [/ }
  28.     foreach ($list as $item) {( b" E# n  W9 I5 F# \
  29.         $tmp = mb_convert_encoding($str, $item, $item);
    1 D9 ?. z# j  k9 o% z
  30.         if (md5($tmp) == md5($str)) {# y# p5 n# B# }7 c! ~$ H' t4 H
  31.             return mb_convert_encoding($str, $charset, $item);
    - [5 @0 [; y# Q/ V+ a8 K3 d
  32.         }
    ; V+ j0 }- n5 I, Q7 b" m  _
  33.     }
    - J. R" _. Y% z" v# }
  34.     return "";
    & K/ R4 F5 {! G! ?, n6 n; M
  35. }
复制代码
9 S  ]- T! O" U/ [; n, ?
2 A1 A. }# i+ @5 N0 f5 B3 G5 w
% I. C7 Z9 m/ W- E5 I

; s1 r6 H: E6 O, j# p! `, u

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表