该用户从未签到
|
关于文件编码的检测,百度一下一大把都是,但是确实没有能用的、% D4 v6 H( d5 O! ~$ H4 g" |
很多人建议 mb_detect_encoding 检测,可是不知为何我这不成功,什么都没输出、
* c Z% c8 W3 P7 h% I3 x$ x* R看到有人写了个增强版,用 BOM 判断的,我果断就无视了,这东西完全不靠谱、
5 u5 h$ W R l5 {: J w; o最终根据PHP手册里 mb_detect_encoding 函数下方的例子,自己写了一个检测函数,) |4 T% ~. t8 S# r( v
还包括自动检测编码并按指点编码读取文件的函数、- j* _+ y* b, _6 f" Y( `
源码献上,不喜勿喷。) n) N( d! G/ _' w7 B+ [: \
网上的方法我试过没用才写的,说不定环境不一样导致的。
% W0 y( Y0 \9 S所以万一没用,也别喷我,我只是共享想思路而已、、
$ t/ z4 x6 y+ ?& |, L: \* q( H0 O- <?php
4 V2 w3 Z0 U7 n) {7 J - /**
" w# b( V) B {% d - * 检测文件编码/ i/ ]1 ~2 v9 E% |/ e# s
- * @param string $file 文件路径* z5 p; w7 [$ r- k2 }2 w5 G
- * @return string|null 返回 编码名 或 null% ~/ k+ d) b& o7 f. l: T
- */3 O! f: U' u5 Q, l$ x9 q
- function detect_encoding($file) {
4 ~$ e2 Y) w, X - $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');7 P6 r7 x0 ]& {- u# g$ D
- $str = file_get_contents($file);
& y f/ V$ g: [ - foreach ($list as $item) {1 {# s& ~. D- d0 \$ p3 ?& k9 R
- $tmp = mb_convert_encoding($str, $item, $item);
2 w0 i3 P& u5 ]+ O1 R0 p( l - if (md5($tmp) == md5($str)) {
. u$ v; O6 U7 L5 O1 I( c - return $item;
# j' @9 I$ d$ U& _3 V - }
7 V9 m' y: c ^+ l% h2 {6 U% w( d. a - }
5 l1 }4 e7 t1 j* E. N1 L7 a" m - return null;) g! _% Z" E* z7 B/ g
- }
" v$ K n3 o/ u2 Q0 w - * ?; z5 n. T- [. i4 S* _" x
- /**
/ R+ Q# ^! i3 f3 l* L - * 自动解析编码读入文件6 q4 ^8 E9 ^0 E' Z# w$ f8 ]: F
- * @param string $file 文件路径
- R: |; W8 n" ^1 f5 ?, r0 W6 | - * @param string $charset 读取编码7 B5 Q, g4 ^8 [: S( m
- * @return string 返回读取内容
; e8 h$ ], i S+ B4 P8 C - */
4 c. S a* ^" X. q - function auto_read($file, $charset='UTF-8') {. y4 V. h* j0 }8 U i4 l
- $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');: m a, ~4 M: n$ H. E; X
- $str = file_get_contents($file);
# |; O6 G8 |) {# i/ ~ - foreach ($list as $item) {
. o7 L* { x$ s0 [ - $tmp = mb_convert_encoding($str, $item, $item);
/ \$ r+ C# L3 W4 g5 d( P0 V - if (md5($tmp) == md5($str)) {
! R1 i/ F# [3 b" H7 x [ - return mb_convert_encoding($str, $charset, $item);
0 Z3 x$ y/ m2 N& w/ l, x8 s; K - }5 x: c2 @* y; {4 b0 @& h( z
- }
* m/ r4 e/ \& k - return "";
% T5 N& b4 k1 ?# V1 H$ U0 o - }
复制代码
( t N" k& u' W6 m9 g
! [3 K' P2 a6 l/ k* r
* E/ S& X6 y6 Q& g
# x( }; X8 E& T& m2 b/ s, \5 A |
|