我试图检测给定字符串的编码,以便稍后使用iconv将其转换为utf-8。我想将源编码集限制为utf8,iso8859-1,windows-1251,CP437
//... $acceptedEncodings = array('utf-8', 'iso-8859-1', 'windows-1251' ); $srcEncoding = mb_detect_encoding($content, $acceptedEncodings, true); if($srcEncoding) { $content = iconv($srcEncoding, 'UTF-8', $content); } //...
问题是mb_detect_encoding似乎不接受CP437作为支持的编码,当我给它一个CP437编码的字符串时,它被分类为iso-8859-1,这导致iconv忽略诸如ü之类的字符。
我的问题是:有没有一种方法可以更早地检测到CP437编码?使用iconv从CP437转换为UTF-8的效果很好,但我只是找不到检测CP437的正确方法。
非常感谢你。
正如之前无数次讨论的那样:从根本上讲,不可能将任何单字节编码与任何其他单字节编码区分开。您得到的是一堆字节。在编码A中,字节x42
可以映射到字符X,而在编码B中,相同的字节可以映射到字符Y。但是关于字节blob的任何信息都没有告诉您,因为您只有字节。他们可以指任何东西。它们在所有编码中均有效。可以识别更复杂的多字节编码(例如UTF-8),因为它们需要遵循更复杂的内部规则。因此,这可能确实可以说这是不合法的UTF-8 。但是,不可能100%肯定地说这绝对是UTF-8,而不是ISO-8859。
您需要具有有关接收到的内容的元数据,该数据可以告诉您内容的编码方式。事后对其进行识别是不现实的。您需要进行实际的内容分析,以找出对文本进行哪种编码最有意义。