【问题标题】:Get file encoding [duplicate]获取文件编码[重复]
【发布时间】:2009-06-16 15:05:32
【问题描述】:

可能重复:
Detect file encoding in PHP

我如何用 PHP 判断一个文件的文件编码是什么?

【问题讨论】:

    标签: php encoding utf-8


    【解决方案1】:

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

    【讨论】:

    • 请问您是创建该函数还是从其他地方复制的。我想在一些生产代码中使用它,我需要知道来源。您还可以详细说明它在做什么吗?谢谢。
    • 它来自 PHP 手册中的评论:php.net/manual/en/function.mb-detect-encoding.php 2006 年 8 月 3 日的评论
    【解决方案2】:

    mb_detect_encoding 应该可以胜任。

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

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

    【讨论】:

    • 我不认为你的最后陈述是正确的。如果是这样,则永远不会检测到 ASCII,因为所有 ASCII 字符串也是 UTF-8。我认为 mb_detect_order() 函数与确定当多个可能有效时返回的编码有关。默认情况下,ASCII 出现在 UTF-8 之前。
    • 根据 PHP 的文档,它应该这样工作,是的。只是似乎没有。如果它按照文档所说的那样工作,它将永远不会返回 UTF-8。当我过去使用它时,它更喜欢 UTF-8 而不是 ASCII,仅当字符串不是有效的 UTF-8 字符串时才返回 ASCII。
    • 我不得不使用发布的函数 pilif,因为这个函数并不总是返回正确的编码。
    【解决方案3】:

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

    例如,HTML 文件旨在在顶部附近包含一个内容类型元标记,以便您的网络浏览器知道使用什么编码.. 例如

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 仅在相当有限的范围内。 UTF-16 文件的编码由 BOM(字节顺序标记)指示,以区分 little-endian 和 big-endian(UTF-16LE 和 UTF-16BE)。但对于其他代码集,没有强制性标识 - 他们只是继续以他们的编码呈现数据。
      【解决方案5】:

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

      另一种选择是使用 system() 或类似方法在有问题的文件上调用file(1)。通常,它也可以告诉您编码。它应该在任何健全的 UNIX 环境中都可用。

      【讨论】:

        猜你喜欢
        • 2011-04-10
        • 2011-07-12
        • 2012-03-30
        • 2022-01-20
        • 2019-07-07
        • 2015-09-08
        • 2019-08-10
        • 2016-08-15
        • 2015-05-21
        相关资源
        最近更新 更多