2012-06-01 142 views
0

我有一個目錄列表代碼,我列出了特定目錄中的所有文件。文件名有一個包含a-z和0-9以外的特定字符。它就像小「我」,沒有點在「我」之上。文件名是:「ClrmameProKullanımıEnglish.mp4」。看看「Kullanımı」和「英語」。你可以看到「我」和「我」之間的區別。PHP自動轉換特殊字符?

現在的問題是,當我做目錄列表PHP自動將字母「I」到「我」,因此在執行的時候重新命名,我得到錯誤

rename(E:/workspace/project/ClrmamePro Kullanimi English.mp4, 
E:/workspace/project/movie_11.mp4) [<a href='function.rename'>function.rename</a>]: The system cannot find the file specified. 

我有一個正則表達式來糾正文件名,但作爲PHP自動將「我」轉換爲「我」,我無法趕上它。

的目錄列表代碼如下

function getDirectoryListing($directory) { 
    // create an array to hold directory list 
    $results = array(); 
    // create a handler for the directory 
    $handler = opendir($directory); 
    // open directory and walk through the filenames 

    while ($file = readdir($handler)) { 
     // if file isn't this directory or its parent, add it to the results 
     if (strpos($file,'.') !== 0) { 
      $results[] = $file; 
     } 
    } 

    closedir($handler); 
    // done! 
    return $results; 
} 

echo '<pre>'; 
print_r(getDirectoryListing('movies')); 
echo '</pre>'; 

的O/PI正在逐漸爲如下:

Array 
(
    [0] => ClrmamePro Kullanimi English.mp4 
    [1] => Download Gears of War 3 - eSoftZone.webm 
    [2] => Facebook_ Science and the Social Graph.MP4 
) 

看到的第一個文件的索引爲0的實際文件名我目錄是

ClrmamePro Kullanımı English.mp4 
+2

你需要證明你使用的代碼。 – JJJ

+0

只有目錄列表代碼。沒有比這更多的 –

+0

你仍然需要展示它。 – JJJ

回答

0

對於movies目錄中的每個文件,以下代碼s nippet輸出文件名以及文件是否存在。顯示的文件名被編碼爲正確顯示特殊字符。

encode方法將字符串"$file "中的所有字符轉換爲HTML實體。該方法是從堆棧溢出文章"How to convert all characters to their html entity equivalent using PHP."中的解決方案稍微修改後的版本文章中找到的解決方案無法在我的PHP服務器上工作,所以我將prependAmpersandAndPound移到了該函數的外部。

// https://stackoverflow.com/a/3005240/788324 
function prependAmpersandAndPound($n) { 
    return "&#$n;"; 
} 
function encode($str) { 
    $str = mb_convert_encoding($str , 'UTF-32', 'UTF-8'); 
    $t = unpack("N*", $str); 
    $t = array_map(prependAmpersandAndPound, $t); 
    return implode("", $t); 
} 

echo "<pre>\n"; 
$listing = getDirectoryListing('movies'); 
foreach ($listing as $file) { 
    echo "\"" . encode($file) . "\" "; 
    if (file_exists('movies/' . $file)) { 
     echo "exists.\n"; 
    } else { 
     echo "does not exist.\n"; 
    } 
} 
echo '</pre>'; 

模仿你的設置,該代碼段中輸出:

HTML來源:

<pre> 
"&#68;&#111;&#119;&#110;&#108;&#111;&#97;&#100;&#32;&#71;&#101;&#97;&#114;&#115;&#32;&#111;&#102;&#32;&#87;&#97;&#114;&#32;&#51;&#32;&#45;&#32;&#101;&#83;&#111;&#102;&#116;&#90;&#111;&#110;&#101;&#46;&#119;&#101;&#98;&#109;" exists. 
"&#67;&#108;&#114;&#109;&#97;&#109;&#101;&#80;&#114;&#111;&#32;&#75;&#117;&#108;&#108;&#97;&#110;&#305;&#109;&#305;&#32;&#69;&#110;&#103;&#108;&#105;&#115;&#104;&#46;&#109;&#112;&#52;" exists. 
"&#70;&#97;&#99;&#101;&#98;&#111;&#111;&#107;&#95;&#32;&#83;&#99;&#105;&#101;&#110;&#99;&#101;&#32;&#97;&#110;&#100;&#32;&#116;&#104;&#101;&#32;&#83;&#111;&#99;&#105;&#97;&#108;&#32;&#71;&#114;&#97;&#112;&#104;&#46;&#77;&#80;&#52;" exists. 
</pre> 

在瀏覽器中顯示:

"Download Gears of War 3 - eSoftZone.webm" exists. 
"ClrmamePro Kullanımı English.mp4" exists. 
"Facebook_ Science and the Social Graph.MP4" exists.