【发布时间】:2019-01-24 19:31:39
【问题描述】:
我们经营一个用户上传图片文件的网站。在 Mac 上生成这些文件时,有时它们的文件名中有 UTF-8 字符(因为 mac 使用 UTF-8 作为其文件系统字符集)。
当 PHP7 代码接收到这些文件时,我们必须将它们存储在本地文件系统中,即 Debian Linux,不支持 UTF-8。
另外,虽然 PHP7 可以支持 UTF-8,但它本身并不能自动支持。
所以,问题是:目前处理此问题的最佳做法是什么?
想法1:
将原始名称保存在数据库中 (Collation = utf8mb4_unicode_ci? ),然后使用 UUID 将图像存储在磁盘上。然后,使用download="" 将文件下载为原始文件名。
专业版:好像解决了问题。
Con:多字节支持在 PHP 中似乎很笨拙(甚至在 7.2.x+ 中)。这是否需要大量检查才能处理它?
想法2:
清理/过滤掉文件名中的 UTF-8 字符,以完全避免该问题。
专业人士:我可以像往常一样在 MySQL/MariaDB 中使用拉丁排序规则,而且我不必担心文件系统字符集。
Con:这是有损的。一个名为touche'.pdf 的文件将被重命名为touch.pdf 或者我必须创建一些等效表来将e' 转换为e。
思想3
我想多了这个问题,或者我错过了一个简单的解决方案。
处理上传的 UTF-8 / 多字节文件名的最佳方法是什么?
【问题讨论】:
-
PHP 有一组丰富的Multibye String 处理选项,也许mb-convert-encoding 函数会有所帮助。
-
对于数据库端,使用
CHARSET utf8mb4,排序规则只是顺序。尝试在本地处理它。似乎是一些 OSX utf8 文件系统讨论stackoverflow.com/questions/6153345/… -
似乎我对上面的两个想法都有答案。似乎我可以使用
mb_detect_encoding来确定如何处理字符,然后使用mb_convert_encoding来转换它,或者使用UUID 解决方案和utf8mb4,两者都可以工作。似乎后者将为我提供最“通用”的解决方案(如果有人将表情符号放在文件名中怎么办?)。所以,除非我们有令人信服的理由不这样做,否则我现在就这样做。如果有人想把它放在那里,我需要一个答案来接受/关闭这个问题...... -
毫无疑问,解决方案 1 是最好的。不确定您对 PHP 的多字节支持有什么顾虑。
标签: mysql utf-8 mariadb php-7 utf8mb4