如何使用PHP检测CP437

时间:2013-12-17 09:06:30

标签: php encoding utf-8

我正在尝试检测给定字符串的编码,以便稍后使用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。

非常感谢。

1 个答案:

答案 0 :(得分:4)

正如之前无数次讨论过的那样:从根本上说,不可能将任何单字节编码与任何其他单字节编码区分开来。你得到的是一堆字节。在编码A中,字节x42可以映射到字符X,而在编码B中,相同的字节可以映射到字符Y.但是没有关于字节blob的信息告诉你,因为你只有字节。他们可以意味着什么。它们在所有编码中同样有效。可以识别更复杂的多字节编码,如UTF-8,因为它们需要遵循更复杂的内部规则。所以可以肯定地说这是有效的UTF-8 。但是,不可能100%确定这绝对是UTF-8,而不是ISO-8859

您需要获得有关您收到的内容的元数据,这些数据会告诉您内容的编码方式。事后确定它是不切实际的。您需要使用实际内容分析来确定哪个编码文本最有意义。