簡體   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