PHP中的字符集检测

PHP中的字符集检测,php,character-encoding,Php,Character Encoding,//我添加了一个新的想法,请看。任何帮助都将不胜感激。我有一个想法,通过将整数打包成无符号字节(只需要8或16位整数就可以大大减少内存),尝试破解数组的存储选项 嗨 我目前正在开发自定义字符集检测库,并从Mozilla的字符集检测算法创建了一个端口,并使用chardet(python端口)作为帮助。然而,在PHP中这是非常占用内存的(如果我只在Western language detection中加载的话,大约有30mb的内存)。我已经尽我所能进行了优化,无需从头开始重新编写来加载每一个片段(这

//我添加了一个新的想法,请看。任何帮助都将不胜感激。我有一个想法,通过将整数打包成无符号字节(只需要8或16位整数就可以大大减少内存),尝试破解数组的存储选项

我目前正在开发自定义字符集检测库,并从Mozilla的字符集检测算法创建了一个端口,并使用chardet(python端口)作为帮助。然而,在PHP中这是非常占用内存的(如果我只在Western language detection中加载的话,大约有30mb的内存)。我已经尽我所能进行了优化,无需从头开始重新编写来加载每一个片段(这会减少内存,但会使它慢得多)

我的问题是,您知道有任何LGPL PHP库可以进行字符集检测吗? 这纯粹是为了研究,为我指明正确的方向


我已经知道mb_detect_编码,但是它太有限了,并且会给我的文本文件带来太多的误报(但是python的chardet可以完美地检测到它们)

首先,您正在从事的有趣的项目!我很好奇最终产品会是什么样子


你已经看过了吗?

我创建了一个方法,可以正确地编码到UTF-8。但很难找出当前编码的内容,因此我采用了以下解决方案:

<?php
function _convert($content) { 
    if(!mb_check_encoding($content, 'UTF-8')
        OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) {

        $content = mb_convert_encoding($content, 'UTF-8');

        if (mb_check_encoding($content, 'UTF-8')) {
            // log('Converted to UTF-8');
        } else {
            // log('Could not converted to UTF-8');
        }
    }
    return $content;
}
?>


正如你所见,我做了一个转换来检查它是否仍然相同(UTF-8/16),如果没有转换它。也许你可以使用这些代码。

@Jase你应该上传你的代码,我们可以提供一些建议!您是否正在重新创建mbstring扩展中已经存在的内容?PHP自己的mb_detect_编码对我来说已经足够好了。我使用它来完成这项任务。如果您提供正确的顺序或猜测,mb_detect_编码效果很好。没有库可以100%准确地检测编码。您可能应该尽可能了解unicode的所有知识,在开始编写任何代码之前全面了解它。简言之,根据unicode的性质,仅仅检查字符串(尤其是短字符串)而不提供一些提示,是无法准确检测字符集的。@Yehonatan-在它的当前形式中,它几乎与python的chardet相同(目前它还处于技术练习阶段)。唯一的区别是加载和卸载特定语言的能力。所以我所做的一个很好的指标就是查看chardet,因为变量名、类结构等都是相同的。Chardet还存在使用快速内存的问题,但内存不足PHP@Dmitri我尝试了所有的mb_检测编码。但是当有大约20个字符集需要检测时,它很快就会变得混乱。在我运行的测试中,它很容易混淆UTF16和UTF32。我已经看了一眼ICU项目(java版本。我不是java程序员,但我可以阅读java)。但选择了chardet cus,移植起来真的很容易。ICU项目与mozilla和python的chardet有什么不同?一般来说效率更高吗?chardet内存如此之大的原因是它为上下文分析加载了大量非常大的数组Hi,感谢您的贡献,但我的目标是创建一个PHP字符集检测库,其中包括SJIS、BIG5、UTF-8/16/32、iso字符集以及更多基于上下文分析的字符集。这通常意味着,如果获取HTTP请求时没有提供编码的标题,或者从外国上传了文本文件,那么我就能够很好地猜测它编码时使用的字符集。然后我可以使用iconv或mb_convert_编码将该字符集转换为UTF-8,以便更容易地操作。它将是模块化的,因此人们也可以插入自己的。您提交的代码可以作为模块创建,但问题是它不支持流。如果使用相当大的文件,这一点至关重要