该用户从未签到
|
关于文件编码的检测,百度一下一大把都是,但是确实没有能用的、
; j- Z6 _5 p* E很多人建议 mb_detect_encoding 检测,可是不知为何我这不成功,什么都没输出、2 D* K7 G9 ~( M2 t5 J: X2 |
看到有人写了个增强版,用 BOM 判断的,我果断就无视了,这东西完全不靠谱、- R7 K7 K' `. N
最终根据PHP手册里 mb_detect_encoding 函数下方的例子,自己写了一个检测函数,
( e; m% C0 F3 b" a还包括自动检测编码并按指点编码读取文件的函数、
2 x7 w/ Q; ]! ]源码献上,不喜勿喷。 a y8 ] c; q7 ?+ E% S$ M. Y; W
网上的方法我试过没用才写的,说不定环境不一样导致的。; k+ `+ \' `# q; Y* d5 R H) Y' v/ C
所以万一没用,也别喷我,我只是共享想思路而已、、; K3 y2 y% J. e, l' x
- <?php& I% H. I2 C8 z5 q; m* {
- /**
; \! ~9 |6 S8 J3 g; i - * 检测文件编码5 ]" f; o5 X' o5 P
- * @param string $file 文件路径( f0 g' g/ P" ^" H" X
- * @return string|null 返回 编码名 或 null
/ }8 ^# J. @2 S2 [! H+ X - */! \; T b. {6 g
- function detect_encoding($file) {" X! F- C3 W7 P6 C: x* U# O* n# N
- $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
2 c* u$ N5 z4 X$ E+ g - $str = file_get_contents($file);4 ]7 `- M1 Z# \2 g1 s2 F8 `
- foreach ($list as $item) {, I0 `' v' G8 p. r+ m7 J& h
- $tmp = mb_convert_encoding($str, $item, $item);% f! r2 N$ v3 h. X! g3 E
- if (md5($tmp) == md5($str)) {2 [4 k$ V' A# A
- return $item;
3 }5 Y3 c8 S" X, c! I+ p3 N- |( c - }; }+ n3 ~9 T6 S0 j }
- }
; L- `2 F P' q - return null;3 F2 b8 l! }, r% {% c3 j1 l4 B( u
- }+ L, K1 T" Z8 q/ u4 D' f; j
# V# G, U' _! ?- m( R* W$ u- /**
6 @' |% `+ _7 c, I* c - * 自动解析编码读入文件6 R" x% i% _. x) t! f3 u
- * @param string $file 文件路径2 Q l. B& i$ u K7 F, f2 W
- * @param string $charset 读取编码: L; k7 E) T" \* W7 \( a
- * @return string 返回读取内容" f/ S6 G0 K( m% C' R& D- }0 F
- */2 }) c: L6 r1 k8 e( n$ x% G+ `
- function auto_read($file, $charset='UTF-8') {# Q+ t: t, a `# |. {* [- \- a
- $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
f( x" I; I3 F+ U' O+ t8 R - $str = file_get_contents($file);
5 y5 ]* c' d- P! Y, K+ l - foreach ($list as $item) {* F8 w- w' n% R. Q K
- $tmp = mb_convert_encoding($str, $item, $item);
8 }) q" n9 p k; z5 `7 s - if (md5($tmp) == md5($str)) {0 ~! w% s W7 e# s W$ l4 Y! v; |: R
- return mb_convert_encoding($str, $charset, $item);
/ Q* z) n& {( S& k: w - }" ~+ u9 C7 E6 i, \4 v
- }
2 U+ i4 X1 I: E/ W/ Y, Y# b - return "";" I! J. g% U8 s, F$ K8 l1 t5 M
- }
复制代码 R- Q* v' k* r& R: G! b: V7 t
( A" o* k ?( ^: y
6 P+ V9 r" z$ c9 _# T7 N' j9 ]
- S. E2 r$ T1 t" g8 C9 B C* s4 e
|
|