From:purple尘
本意是判断文件内容的编码的,以下内容仅针对linux环境:
在网上搜了半天再加上参考php手册、暂时了解到:
1、函数 mb_detect_encoding() 可以检测编码。这个函数最后一个参数为布尔型,true的话会进行严格的检测,需要安装扩展:mbstring.so。
安装后再试下。
2、手册中写的,如果没有mb_detect_encoding了可以用下方所示代码进行检测,依赖的是icnov函数、这个函数也可以用mb_convert_encoding替换。
两者是有区别的,后者貌似比前者靠谱、但是效率要慢,再具体就不太清楚了、感兴趣的可以去翻源码了。
最下方是手册原话。
3、手册中这样使用iconv的原理不太清楚,暂时猜测:针对字符的解码与编码、只有当编码格式正确的时候、才是可逆的,具体是这样子:
如果字符串是gbk编码的,那么用gbk对字符串进行解码再编码没问题;但是针对这个字符串用utf-8进行解码再编码的话就出事儿了、二进制的字节流会有变化,也就产生了损伤。
if the function " mb_detect_encoding" does not exist ...
... try:
<?php
// ----------------------------------------------------
if ( !function_exists('mb_detect_encoding') ) {
// ----------------------------------------------------------------
function mb_detect_encoding ($string, $enc=null, $ret=null) {
static $enclist = array(
'UTF-8', 'ASCII',
'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5',
'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10',
'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
'Windows-1251', 'Windows-1252', 'Windows-1254',
);
$result = false;
foreach ($enclist as $item) {
$sample = iconv($item, $item, $string);
if (md5($sample) == md5($string)) {
if ($ret === NULL) { $result = $item; } else { $result = true; }
break;
}
}
return $result;
}
// ----------------------------------------------------------------
}
// ----------------------------------------------------
?>