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

标签 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:似乎可以解决问题。

缺点:多字节支持在 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/

相关文章:

java - 使用字符集编码读取文件

java - 西类牙语字符 ("` "、 "´"、 "ñ") 未显示在数据库中

mysql - 向主键插入 utf-8 数据时出现重复条目

mysql - 一次按两列分组还是?

mysql - 我不知道如何将此查询转换为 Eloquent 或 Fluent 查询生成器

mysql - #1221 - UPDATE 和 ORDER BY 的使用不正确

mysql - 错误1452:无法添加或更新子行:外键约束失败

mysql - 如何在 ddev 中创建和加载第二个数据库?

mysql - 如何重命名 mariaDB 中的列名

mysql - 获取 : java. sql.SQLException:未知系统变量 'language' spring boot