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

new*_*php 3 php windows filesystems encoding utf-8

file_exists()并且file_get_contents()在一个名为output‹ÕÍÕ¥.txt(例如)的文件上失败,虽然我知道它存在?

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

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

感谢所有回复.

供参考:

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

我在Windows上使用PHP 5.2.

hak*_*kre 5

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

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

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

编辑:

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

这正是我的答案所在.正如这里所写:

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

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

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

EDIT2:

假设你有NTFS 可以接受UTF-16(这是不是真的准确AFAIK,但你可以试试看),你可以在UTF-8的文件名转换为UTF-16文件名:

$name = mb_convert_encoding($name, 'UTF-16', 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

然后尝试file_exists是否有效.请记住,他可能不是技术上是正确的,可能有一个额外的编码问题,它会阻止您正确使用,即使重新编码此.

相关:NTFS中存储的文件名是什么编码?