我们运营一个网站,用户可以在其中上传图像文件。当这些文件在 Mac 上生成时,有时它们的文件名中包含 UTF-8 字符(因为 mac 使用 UTF-8 作为其文件系统字符集)。
当PHP7代码接收到这些文件时,我们必须将它们存储在本地文件系统中,该文件系统是Debian Linux,不支持UTF-8。
此外,虽然 PHP7 可以支持 UTF-8,但它本身并不支持或自动支持。
因此,问题是:当前处理此问题的最佳做法是什么?
想法 1:
将原始名称保存在数据库中 (Collation = utf8mb4_unicode_ci
? ),然后使用 UUID 将图像存储在磁盘上。然后,使用 download=""
将文件下载为原始文件名。
Pro:似乎可以解决问题。
缺点:多字节支持在 PHP 中似乎很笨拙(即使在 7.2.x+ 中也是如此)。这是否需要大量检查才能处理?
想法 2:
清理/过滤掉文件名中的 UTF-8 字符以完全避免该问题。
Pro:我可以像往常一样在 MySQL/MariaDB 中使用拉丁排序规则,而且我不必担心文件系统字符集。
Con:这是有损的。名为 touche'.pdf
的文件将重命名为 touch.pdf
或者我必须创建一些等效表以将 e'
转换为 e
.
想法三
我想多了这个问题,或者我缺少一个简单的解决方案。
处理上传的 UTF-8/多字节文件名的最佳方法是什么?
最佳答案
考虑 PHP 的 urlencode()
将 UTF-8 字符转换为 % 加十六进制。
fn 'smiley-☺'
urlencode 'smiley-%E2%98%BA'
bin2hex '736d696c65792de298ba'
我可能更喜欢简单地将 urlencode
应用于每个条目——纯 ascii 格式的名称将保持不变。而且我认为 %
不会造成麻烦。其他标点符号可能会引起麻烦(例如 /
)。
关于mysql - 在 PHP7 中,清理包含文件名的 UTF8 字符的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51900763/