文件名中的变音符号用点替换

时间:2016-01-11 12:56:39

标签: php utf-8 character-encoding

因此,用户试图将文件名中带有变音符号的文件上传到我的系统(系统正在运行apache2,laravel充当框架)。该脚本的作用是将文件上传到服务器并在DB中保存一个条目(编码为utf8_general_ci)。但是当他试图下载文件时,他得到一个未找到的文件"错误。我看着它,文件已经正确上传到服务器。当我下载它们并查看控制台中的文件名时,它们看起来像这样:

See screenshot

您会注意到最后一个文件正确显示。我尝试重命名它,我只是用相同的字母替换了变音字母并修复了它。你知道问题可能是什么吗?

2 个答案:

答案 0 :(得分:0)

查看上传脚本使用的编码类型。可能的解决方案是在保存到磁盘和DB(仅允许a-z和数字)之前重命名文件,这是一种很好的做法。

答案 1 :(得分:0)

听起来像缺少Unicode规范化的情况。

有多种方法可以编码某些字形。例如,ä可以使用预先组合的单个字形U+00E4或作为(U+0061)的组合序列,然后是combining diaeresis (U+0308)来表达。

您的代码应该决定单个Unicode规范化(取决于您的平台哪一个 - 如果,如截图似乎暗示,您在Wintendo上,我想NFKC,但它不是我非常友好的平台)并确保在尝试打开文件之前对所有文件名进行规范化。

有关详细信息,请参阅https://en.wikipedia.org/wiki/Unicode_equivalence