PHP无法识别带有撇号的文件名

时间:2015-04-22 07:51:38

标签: php file-exists apostrophe

目前我正在尝试用PHP检查文件是否存在。我试图检查当前文件是否存在撇号,该文件名为:13067-AP-03 A - Situationprojetée.pdf。

我用来检查文件是否存在的代码是:

$filename = 'C:/13067-AP-03 A - Situation projetée.pdf';

if (file_exists($filename)) 
{
    echo "The file exists";
} else 
{
    echo "The file does not exist";
}

我现在面临的问题是,每当我尝试检查文件是否存在时,我都会收到它不存在的消息。如果我继续删除é,我会收到文件确实存在的消息。

如果文件中有撇号,那么看起来PHP无法识别该文件。我尝试了以下方法:

urlencode($filename);
addslashes($filename);
utf8_encode($filename);

其中没有一个有效。我也尝试过:

setlocale(LC_ALL, "en_US.utf8");

也许值得注意的是,当我直接从PHP获取文件名时,我得到以下内容: 13067-AP-03 A - 情况projet e.pdf

我必须执行以下操作才能正确显示文件名:

$filename = iconv( "CP437", 'UTF-8', $filename);

我想知道以前是否有人遇到过同样的问题,可以帮我解决这个问题。非常感谢所有帮助。

对于那些感兴趣的人,脚本在Windows机器上运行。

奇怪的是这很有效:我将Sublime Text 3中的所有源代码复制到记事本中。我继续通过覆盖PHP文件将源代码保存在记事本中。

现在,当我检查文件是否存在时,它会显示以下存在的文件名:

13067-AP-03 A - Situation projet�e.pdf

我现在面临的唯一问题是我想使用file_get_contents下载文件。但是file_get_contents并没有将inter作为撇号插入。

3 个答案:

答案 0 :(得分:1)

我认为这是Windows下的PHP问题。我将Windows二进制副本下载到我的Windows日语版并成功复制了您的问题。

根据https://bugs.php.net/bug.php?id=47096

  

因此,如果您将文件的通用名称(及其路径)作为Unicode字符串$ u(例如UTF-8编码)并且您想尝试在Windows下使用该名称保存它,则必须首先检查当前语言环境调用setlocale(LC_CTYPE,0)以检索当前代码页,然后必须根据代码页将$ u转换为字节数组;如果一个或多个代码点在当前代码页中没有对应的代码,则无法使用PHP中的该名称保存该文件。点。

我的代码页是CP932,您可以通过在cmd中运行chcp来查看自己的代码页。

所以代码应该是:

$filename='C:\Users\Frederick\Desktop\13067-AP-03 A - Situation projetée.pdf';
$filename=mb_convert_encoding($filename, 'CP932', 'UTF-8');
var_dump($filename);
var_dump(file_exists($filename));

但这不起作用!为什么?因为CP932不包含é

的字符

根据https://msdn.microsoft.com/en-us/library/windows/desktop/dd317748%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

  

NTFS以Unicode格式存储文件名。相反,旧的FAT12,FAT16和FAT32文件系统使用OEM字符集。

Windows本身使用UTF-16LE(由Microsoft称为Unicode)来保存其文件名。但PHP不支持UTF-16LE编码的文件名。

总之,遗憾的是,如果您在Windows上工作,我找不到解决问题的方法而不是在命名文件时转义所有这些字符。我也不认为PHP团队将来会解决这个问题。

答案 1 :(得分:-1)

确保文本编辑器将文件保存为“无BOM的UTF-8”

BOM是字节顺序标记,在文件的开头放置两个字节,允许软件读取文件以确定它是否已保存为little-endian或big-endian,但PHP解释器无法解释这些字符和所以你必须保存没有字节顺序标记的文件。

答案 2 :(得分:-2)

在启动php文件时尝试此操作:

<?php
header('Content-Type: text/html; charset=utf-8');
?>