PHP中的字符集检测

4

//我对此进行了新的尝试,请参见欺骗PHP整数。非常感谢您的帮助。我有一个想法,尝试通过将整数打包成无符号字节(只需要8或16位整数即可大大减少内存)来黑掉数组的存储选项。

你好

我目前正在开发自定义字符集检测库,并从Mozilla的字符集检测算法创建了一个端口,并使用chardet(python端口)作为帮助手段。然而,在PHP中这是极其占用内存的(如果我只加载西方语言检测,大约需要30MB的内存)。我已经尽力优化了所有可以优化的内容,但不想从头开始重写每个部分以加载(这会减少内存,但使其变得更慢)。

我的问题是,您是否知道任何LGPL PHP库可以进行字符集检测? 这纯粹是为了研究,给我一点指导方向。

我已经知道mb_detect_encoding,但它太有限了,并且在我拥有的文本文件中带来了太多误报(而Python的chardet完美地检测到它们)


1
如果您提供正确的顺序或猜测,mb_detect_encoding可以很好地工作。没有库能够100%准确地检测编码。在开始编写任何代码之前,您应该尽可能了解Unicode并深入了解它。简而言之 - 由于Unicode的本质,仅通过检查字符串(特别是没有提供任何提示的短字符串)无法准确检测字符集。 - Dmitri
@Yehonatan - 目前来看,它几乎与Python的chardet相同(目前只处于技术练习阶段)。唯一的区别是能够加载和卸载特定的大陆语言检查。因此,了解我所做的工作的一个好指标是查看chardet,因为变量名称、类结构等都是相同的。Chardet也存在使用大量内存的问题,但远不及PHP。 - Jase
@Dmitri 我已尝试了mb_detect_encoding的所有方法。但是当有大约20种字符集需要检测时,它很容易混淆。在我运行的测试中,它很容易混淆UTF16和UTF32。 - Jase
@Dmitri。你有使用的特定顺序我可以尝试吗?我编写了一个快速脚本,将运行我的300个文本文件中的每一个。我使用chardet获得了98%的成功率,但上次我尝试使用mb_detect_encoding时只有82%的成功率。 - Jase
@Jase 这是我的检测顺序: $aDetectOrder = array('ASCII', 'UTF-8','ISO-8859-1', 'JIS', 'ISO-8859-15', 'EUC-JP', 'SJIS' ); - Dmitri
显示剩余4条评论
2个回答

1

我创建了一个能够正确编码为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),如果不是,则进行转换。也许您可以使用其中的一些代码。


你好,感谢您的贡献,但我的目标是创建一个PHP字符集检测库,其中包括SJIS、BIG5、UTF-8/16/32、ISO字符集等等,基于上下文分析。这通常意味着,如果抓取HTTP请求没有提供编码标题或从外国上传了文本文件,我将能够很好地猜测它所使用的字符集。然后,我可以使用iconv或mb_convert_encoding将该字符集转换为UTF-8,以便更轻松地进行操作。它将是模块化的,因此人们也可以插入自己的模块。 - Jase
您提交的代码可以被创建为一个模块,但问题在于它不支持流。如果要处理相对较大的文件,则这一点至关重要。 - Jase

0

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

你已经看过ICU项目了吗?


我已经浏览了ICU项目(Java版本。虽然我不是Java程序员,但我可以阅读Java),但选择了chardet,因为它很容易移植。ICU项目与Mozilla和Python的chardet有什么区别?它通常更有效吗?Chardet如此占用内存的原因是因为它加载了大量非常大的数组进行上下文分析。 - Jase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接