在名为output‹;的文件上,file_exists()和file_get_contents()失败ÕÍÕ¥;。PHP中的txt?

在名为output‹;的文件上,file_exists()和file_get_contents()失败ÕÍÕ¥;。PHP中的txt?,php,windows,encoding,utf-8,filesystems,Php,Windows,Encoding,Utf 8,Filesystems,file_exists()和file_get_contents()在名为outputè×Õ¥.txt的文件上失败(例如),尽管我知道它存在 我猜这与文件名中的特殊字符有关 所以我想知道什么是解决办法 感谢所有回复 供参考: 请注意,如果您认为为什么不简单地更改文件名我不能,因为文件名是一般生成的,更改文件名意味着使用PHP的文件函数(似乎不允许在文件名参数中使用特殊字符-除非我误解了/误解了任何内容) 我在Windows上使用PHP5.2。确保文件系统的编码与PHP代码中包含文件名的字符串的编码

file_exists()
file_get_contents()
在名为
outputè×Õ¥.txt的文件上失败(例如),尽管我知道它存在

我猜这与文件名中的特殊字符有关

所以我想知道什么是解决办法

感谢所有回复

供参考:

请注意,如果您认为为什么不简单地更改文件名我不能,因为文件名是一般生成的,更改文件名意味着使用PHP的文件函数(似乎不允许在文件名参数中使用特殊字符-除非我误解了/误解了任何内容)


我在Windows上使用PHP5.2。

确保文件系统的编码与PHP代码中包含文件名的字符串的编码相同

否则,您将测试是否存在错误的文件

例如,如果文件系统不支持UTF-8,但文件名以UTF-8编码

编辑:

因此,您评论说文件名是UTF-8,您正在使用windows

这正是我回答的重点。作为:

Windows用户的坏消息:Windows文件系统(FAT、FAT32、NTFS)不支持UTF-8。根据文件系统和本地化,文件名以ISO-8859-1或CP437/CP850/(或任何适合您的语言)进行编码。所以,如果您遵循本指南,在尝试将文件名从数据库匹配到文件系统时可能会遇到麻烦。(尽管我从未尝试过。)

Windows解决方案:现代Windows版本支持装载共享上的UTF-8。共享mediafolder并将其作为网络驱动器装载

因此,要么进行共享,要么对文件名进行编码,这种编码实际上适用于您的文件系统。这不是PHP中的错误。你只是没有检查正确的文件名,仅此而已

Edit2:

假设您有可能接受UTF-16的NTFS(这在AFAIK中并不精确,但您可以尝试一下),您可以将UTF-8文件名转换为UTF-16 fiĺename:

$name = mb_convert_encoding($name, 'UTF-16', 'UTF-8');
然后尝试一下文件_是否存在。请记住,his在技术上可能不正确,并且您可能还有一个额外的编码问题,这会阻止您正确使用此重新编码


相关:

你看了吗?@sdolgy:没有必要对存在的文件等进行shell转义。@NewTopHP:如何获取文件名?根据mb\U detect\U编码()文件名是UTF-8…在谷歌搜索之后,我发现了以下错误:?因此,如果是这样的话,那么我可以使用exec()(或类似工具)将文件重命名为文件系统函数可以接受的文件名,而不是直接使用文件系统函数吗?@newbtophp:Err,这正是问题所在:最明显的是,您的windows不支持UTF-8文件名。这毕竟不是PHP中的错误。你会注意到,如果你把它也传给外壳。为了更清楚,编辑了这个问题。您需要注意使用正确的文件名。