我们经营着一个用户上传图像文件的网站。在Mac上生成这些文件时,有时它们的文件名中包含UTF-8字符(因为mac使用UTF-8作为其文件系统字符集)。
当PHP7代码接收到这些文件时,我们必须将它们存储在本地文件系统(即Debian Linux)中,并且不支持UTF-8。
此外,虽然PHP7可以支持UTF-8,但它不是本机或自动执行的。
因此,问题是:处理此问题的当前最佳实践是什么?
思想1 :
将原始名称保存在数据库中(Collation = 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 /多字节文件名的最佳方法是什么?
答案 0 :(得分:0)
考虑PHP的urlencode()
将UTF-8字符转换为%加十六进制。
fn 'smiley-☺'
urlencode 'smiley-%E2%98%BA'
bin2hex '736d696c65792de298ba'
我可能更愿意将urlencode
应用于每个条目-纯ascii名称将保持不变。而且我认为%
不会造成麻烦。其他标点符号可能会引起麻烦(例如/
)。