代码之家  ›  专栏  ›  技术社区  ›  powtac

获取文件编码[重复]

  •  3
  • powtac  · 技术社区  · 17 年前

    可能重复:
    Detect file encoding in PHP

    5 回复  |  直到 9 年前
        1
  •  9
  •   pilif    17 年前

    除了utf-8(因为并非每个8位字节序列都是有效的utf-8),检测编码对于所有8位字符集都非常困难,并且通常需要检测编码的文本的语义知识。

    想想看:任何特定的纯文本信息都只是一堆字节,没有相关的编码信息。如果你看任何一个特定的字节,它可能意味着 任何东西 ,因此,为了有机会检测编码,您必须在其他字节的上下文中查看该字节,并根据可能的情况尝试一些启发式方法 结合体

    但对于8位字符集,您永远无法确定。

    举例来说,这里演示了启发式出错:

    http://www.hoax-slayer.com/bush-hid-the-facts-notepad.html

    对于某些16位集,您有机会检测到,因为它们可能包含字节顺序标记或将每秒字节设置为0。

    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);
    }
    
        2
  •  3
  •   BlackAura    17 年前

    mb_detect_编码应该能够完成这项工作。

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

        3
  •  1
  •   Rik Heywood    17 年前

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

    例如,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" />
    

    有一些方法试图通过查看文件并找出提示某些编码的字节序列来猜测,但这些方法实际上只是猜测。

        4
  •  0
  •   Spike Williams    17 年前

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

        5
  •  0
  •   alanc    14 年前

    黑光环的建议很好,伊姆霍。

    file