在PHP7中,清理包含文件名的UTF8字符的最佳方法是什么?

时间:2018-08-17 18:02:02

标签: mysql utf-8 mariadb php-7 utf8mb4

我们经营着一个用户上传图像文件的网站。在Mac上生成这些文件时,有时它们的文件名中包含UTF-8字符(因为mac使用UTF-8作为其文件系统字符集)。

当PHP7代码接收到这些文件时,我们必须将它们存储在本地文件系统(即Debian Linux)中,并且不支持UTF-8。

此外,虽然PHP7可以支持UTF-8,但它不是本机或自动执行的。

因此,问题是:处理此问题的当前最佳实践是什么?

思想1

将原始名称保存在数据库中(Collat​​ion = utf8mb4_unicode_ci?),然后使用UUID将图像存储在磁盘上。然后,使用download=""将文件下载为原始文件名。

Pro :似乎可以解决问题。

Con :在PHP中(甚至在7.2.x +中),多字节支持似乎很笨拙。是否需要大量支票才能处理?

思想2

清理/过滤掉文件名中的UTF-8字符,以完全避免出现此问题。

Pro :我可以像往常一样在MySQL / MariaDB中使用拉丁排序规则,而不必担心文件系统字符集。

Con :这是有损的。名为touche'.pdf的文件将被重命名为touch.pdf,或者我必须创建一些等效表才能将e'转换为e

思想3

我已经考虑了这个问题,或者我错过了一个简单的解决方案。

处理上传的UTF-8 /多字节文件名的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

考虑PHP的urlencode()将UTF-8字符转换为%加十六进制。

fn        'smiley-☺'
urlencode 'smiley-%E2%98%BA'
bin2hex   '736d696c65792de298ba'

我可能更愿意将urlencode应用于每个条目-纯ascii名称将保持不变。而且我认为%不会造成麻烦。其他标点符号可能会引起麻烦(例如/)。