【问题标题】:file_exists() and file_get_contents() fail on a file which is named output‹ÕÍÕ¥.txt in PHP?file_exists() 和 file_get_contents() 在 PHP 中名为 output‹ÕÍÕ¥.txt 的文件上失败?
【发布时间】:2011-10-01 20:47:31
【问题描述】:

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

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

那么想知道有什么解决方法吗?

感谢所有回复。

仅供参考:

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

我在 Windows 上使用 PHP 5.2。

【问题讨论】:

标签: php windows encoding utf-8 filesystems


【解决方案1】:

确保文件系统的编码与 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 中的错误。您只是没有检查正确的文件名,仅此而已。

编辑2:

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

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

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

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

【讨论】:

  • 那么根据 mb_detect_encoding() 文件名是 UTF-8 ......经过一番谷歌搜索后,我遇到了以下错误:bugs.php.net/bug.php?id=46990 ?因此,如果是这种情况,那么我可以使用 exec() (或类似方法)将文件重命名为文件系统函数接受的文件名,而不是直接使用文件系统函数吗?
  • @newbtophp:呃,这正是重点:您的 Windows 最明显不支持 UTF-8 文件名。毕竟这不是 PHP 中的错误。你会注意到,如果你也将它传递给 shell。为更清楚起见,编辑了问题。您需要注意自己拥有正确的文件名。
猜你喜欢
  • 2012-09-28
  • 2016-12-31
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2013-01-02
  • 1970-01-01
相关资源
最近更新 更多