繁体   English   中英

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

[英]PHP doesn't recognize filename with apostrophe in it

目前,我正在尝试使用PHP检查文件是否存在。 我正在尝试检查的当前文件是否存在撇号,该文件名为:13067-AP-03 A-情境projeté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不会将其作为撇号插入。

我认为这是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/zh-cn/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团队会在将来解决该问题。

确保您的文本编辑器将文件另存为“没有BOM的UTF-8”

BOM是字节顺序标记,位于文件开头的两个字节,允许软件读取文件以确定文件是否已保存为小端或大端,但是PHP解释程序无法解释这些字符,因此您必须保存不带字节顺序标记的文件。

在您的php文件开始时尝试以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM