【发布时间】:2009-06-16 15:05:32
【问题描述】:
【问题讨论】:
【问题讨论】:
检测编码对于所有 8 位字符集来说真的很困难,但 utf-8(因为不是每个 8 位字节序列都是有效的 utf-8),并且通常需要检测编码的文本的语义知识。
想一想:任何特定的纯文本信息都只是一堆没有相关编码信息的字节。如果您查看任何特定字节,它可能意味着任何东西,因此为了有机会检测编码,您必须在其他字节的上下文中查看该字节并尝试一些基于可能的启发式语言组合。
对于 8 位字符集,您永远无法确定。
例如,启发式方法出错的演示如下:
http://www.hoax-slayer.com/bush-hid-the-facts-notepad.html
一些 16 位的集合,您有机会检测到,因为它们可能包含字节顺序标记或每隔一个字节设置为 0。
如果你只是想检测 UTF-8,你可以使用前面解释过的 mb_detect_encoding,也可以使用这个方便的小函数:
function isUTF8($string){
return preg_match('%(?:
[\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
|\xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
|\xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
|\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
|[\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
|\xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)+%xs', $string);
}
【讨论】:
mb_detect_encoding 应该可以胜任。
http://us.php.net/manual/en/function.mb-detect-encoding.php
在它的默认设置中,它只会检测 ASCII、UTF-8 和一些日本 JIS 变体。如果您手动指定它们,它可以配置为检测更多编码。如果文件既是 ASCII 又是 UTF-8,它将返回 UTF-8。
【讨论】:
你真的不能,除非文件好心地告诉你里面的某个地方。
例如,HTML 文件旨在在顶部附近包含一个内容类型元标记,以便您的网络浏览器知道使用什么编码.. 例如
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
或
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
有一些方法可以通过查看文件并找出暗示某些编码的字节序列来尝试猜测,但这些实际上只是猜测。
【讨论】:
您可以使用 fread() 函数查看“magic number”文件的前几个字节,然后将该幻数映射到文件类型的已知幻数列表。
【讨论】:
BlackAura 的建议非常好,恕我直言。
另一种选择是使用 system() 或类似方法在有问题的文件上调用file(1)。通常,它也可以告诉您编码。它应该在任何健全的 UNIX 环境中都可用。
【讨论】: