file_exists()和file_get_contents()在PHP中名为output <ÕÍÕ¥.txt的文件上失败?

时间:2011-07-09 12:51:25

标签: php windows encoding utf-8 filesystems

file_exists()file_get_contents()在名为output‹ÕÍÕ¥.txt的文件上失败(作为示例),虽然我知道它存在吗?

我猜它与文件名中的特殊字符有关吗?。

所以想知道什么是解决方法?

感谢所有回复。

供参考:

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

我在Windows上使用PHP 5.2。

1 个答案:

答案 0 :(得分:5)

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

否则,您正在测试存在的错误文件。

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

修改

所以你评论说文件名是UTF-8而你正在使用windows。

这正是我的答案所在。正如written here

  

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

     

Windows解决方法:现代Windows版本在已安装的共享上支持UTF-8。分享您的媒体文件夹并将其作为网络驱动器安装。

因此,要么在实际使用文件系统的编码中进行共享或编码文件名。这不是PHP中的错误。你只是没有检查正确的文件名,就是这样。

<强> EDIT2:

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

$name = mb_convert_encoding($name, 'UTF-16', 'UTF-8');

然后尝试file_exists是否有效。请记住,他可能在技术上不正确,可能有一个额外的编码问题,即使使用此重新编码也无法正确使用。

相关:What encoding are filenames in NTFS stored as?