【问题标题】:Detecting char encoding on direct file uploads PHP检测直接文件上传PHP的char编码
【发布时间】:2016-11-10 10:34:28
【问题描述】:

在我的网站上,我允许直接上传文本文件。然后将这些文件存储在服务器上,并显示在网站上。我在网站上使用 UTF-8。

现在,当人们上传包含特殊字符的非UTF-8 文件时,我遇到了麻烦,例如é

我一直在做一些测试。制作了 2 个文本文件,都包含相同的单词 fiancée。一种编码 UTF-8 和一种编码 ISO 8859-2。

UTF-8 上传正常,显示文本正确,但 ISO 8859-2 显示为 fianc�e

现在我尝试用mb_detect_encoding 检测上传的文件内容,但无论我扔给它什么文件,它总是检测到UTF-8。

我注意到我可以使用utf8_encode 将 ISO 8859-2 文件转换为有效的 UTF-8,但这仅适用于非 UTF 文件。由于我目前无法检测到非 UTF 文件,因此我无法使用 utf8_encode 函数,因为它会混淆有效的 UTF-8 文件。

希望这是有道理的:)

所以我的问题是,我如何才能检测到肯定不是以 UTF-8 编码开头的文件,以便我可以对它们使用 utf8_encode 函数。

【问题讨论】:

    标签: php encoding utf-8 character-encoding


    【解决方案1】:

    你不能。欢迎使用编码。

    说真的,文件只是二进制 blob。文件中的位和字节可能意味着任何东西;它可以是图像、CAD 数据,也可能是文本。这取决于您如何解释字节。对于文本文件,这意味着您使用哪种编码来解释它们。文件本身并没有告诉您正确的编码,您必须知道它。通常,您想从文件随附的 元数据 中了解它。但是,在随机用户上传的情况下,没有元数据,和/或它不可靠。所以你不能“知道”。

    下一步是猜测,但这显然不是万无一失的。您可以排除某些编码,例如,如果文件未验证为 UTF-8 (mb_check_encoding($data, 'UTF-8') == false),则它不能是 UTF-8。但是,任何单字节编码都将像任何其他单字节编码一样进行验证。通过这种方式区分 ISO-8859-1 和 ISO-8859-2 是不可能的,字节在两者中都同样有效。只是出现的角色可能不是你想要的。要自动检测 that,您需要一个统计语言分析器,它可以告诉您 this 字符可能不应该出现在 that 单词中符合语法。显然,要使其工作,您需要知道文件中使用的语言,或者您需要先检测那个......即使这样也很难做到万无一失。

    最明智的方法是询问用户。接受上传,也许做一些可以排除哪些编码的前期测试,然后询问用户文件在一堆可能的编码中的哪一个。向他们展示结果,当解释为选择的编码时文件的样子,让用户确认它看起来没问题。当您打开一个编码不明确的文件时,许多体面的文本编辑器都会这样做。

    【讨论】:

    • 谢谢。我害怕这个。与此同时,我发现:github.com/neitanod/forceutf8 实际上对我来说效果很好。
    • 根据定义,库 无法 正常工作,您会遇到各种无法正常工作的边缘情况。只是为了让你意识到它......
    猜你喜欢
    • 2018-07-30
    • 2013-09-09
    • 2010-10-05
    • 2012-12-23
    • 1970-01-01
    • 2014-03-05
    • 2012-10-13
    • 2013-06-03
    相关资源
    最近更新 更多