在直接文件上传PHP上检测字符编码

时间:2016-11-10 10:34:28

标签: php encoding utf-8 character-encoding

在我的网站上我允许直接上传文本文件。然后将这些文件存储在服务器上,并显示在网站上。我在网站上使用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函数。

1 个答案:

答案 0 :(得分:3)

你做不到。欢迎来到编码。

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

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

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