获取文件编码

时间:2009-06-16 15:05:32

标签: php encoding utf-8

  

可能重复:
  Detect file encoding in PHP

我怎样才能弄清楚文件编码的文件是什么?

5 个答案:

答案 0 :(得分:8)

检测编码对于所有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);
}

答案 1 :(得分:3)

mb_detect_encoding应该能够完成这项工作。

http://us.php.net/manual/en/function.mb-detect-encoding.php

在它的默认设置中,它只会检测ASCII,UTF-8和一些日本JIS变种。如果您手动指定,则可以将其配置为检测更多编码。如果文件既是ASCII又是UTF-8,它将返回UTF-8。

答案 2 :(得分:1)

你不能真的,除非文件足够好,可以告诉你里面的某个地方。

例如,HTML文件意味着在顶部附近包含内容类型元标记,以便您的Web浏览器知道使用了哪种编码。例如

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

有些方法试图通过查看文件和发现建议某些编码的字节序列来猜测,但这些只是猜测。

答案 3 :(得分:0)

您可以使用fread()函数查看文件的前几个字节“magic number”,然后将该幻数映射到文件类型的已知幻数列表。

答案 4 :(得分:0)

BlackAura的建议非常好,恕我直言。

另一个选择是使用system()等在有问题的文件上调用file(1)。通常,它也可以告诉你编码。它应该在任何理智的UNIX环境中都可用。