在php7中,清除包含文件名的utf8字符的最佳方法是什么?

6fe3ivhb  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(434)

我们运行一个用户上传图像文件的网站。当这些文件在mac上生成时,有时它们的文件名中包含utf-8字符(因为mac使用utf-8作为其文件系统字符集)。
当php7代码接收到这些文件时,我们必须将它们存储在本地文件系统中,该文件系统是debian linux,不支持utf-8。
另外,虽然php7可以支持utf-8,但它不支持本机或自动执行。
所以,问题是:目前处理这个问题的最佳做法是什么?
想法1:
在数据库中保存原始名称(排序规则= utf8mb4_unicode_ci ? ), 然后使用uuid将图像存储在磁盘上。然后,使用 download="" 将文件下载为原始文件名。
赞成:似乎解决了问题。
缺点:在php中,多字节支持似乎很笨拙(甚至在7.2.x+中也是如此)。这需要大量的支票来处理吗?
想法二:
清理/过滤掉文件名中的utf-8字符,以完全避免问题。
赞成:我可以像往常一样在mysql/mariadb中使用拉丁文排序规则,而且我不必担心文件系统字符集。
缺点:这是有损的。一个名为 touche'.pdf 将被重命名 touch.pdf 或者我必须创建一些等价表 e' 进入 e .
思想3
我已经考虑过这个问题,或者我错过了一个简单的解决办法。
处理上传的utf-8/多字节文件名的最佳方法是什么?

izj3ouym

izj3ouym1#

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

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

我可能更喜欢简单的申请 urlencode 对于每个条目--纯ascii格式的名称将保持不变。我不认为 % 会引起麻烦的。其他标点符号可能会引起麻烦(例如 / ).

相关问题