[英]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不包含é
字符!
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.