簡體   English   中英

php readdir問題與日語文件名

[英]php readdir problem with japanese language file name

我有以下代碼

<?php
if ($handle = opendir('C:/xampp/htdocs/movies')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo $file."<br />\n";
        }
    }
    closedir($handle);
}
?>

當它確實有像日語這樣的mb語言時,它不能正常顯示而是顯示像kyuukyoku Choujin R ?????~? 而不是kyuukyoku Choujin R研極極人あ〜る

無論如何要讓它顯示正確的名稱或使其仍可由其他人下載?

謝謝你幫助我:)

我不能肯定地說PHP,但我懷疑它與Python 2的基本問題相同(之前添加了對Unicode字符串文件名的特殊支持)。

我相信PHP正在使用標准C庫'open'-et-al函數來處理文件名,這些函數是基於字節的。 在Windows(NT)上,這些嘗試使用系統代碼頁對真實的Unicode文件名進行編碼。 這可能是西方機器的cp1252(類似於ISO-8859-1),或日本機器上的cp932(類似於Shift-JIS)。 對於系統代碼頁中不存在的任何字符,您將獲得“?” 字符,你將無法引用該文件。

為了解決這個問題,PHP必須像Python 3.0一樣開始使用Unicode字符串作為文件名(以及其他所有內容),使用'_wopen'-et-al函數來獲取Windows下文件名的本機Unicode訪問。 我希望這會發生在PHP6中,但目前你可能已經填滿了。 您可以將系統代碼頁更改為cp932以訪問文件名,但您仍然可以獲得'?' 其他任何Unicode字符的字符不是在按住Shift JIS,在任何情況下,你真的不想讓你的應用程序的內部串所有的移位,JIS,因為它是一個相當可怕的編碼。

如果你自己的腳本選擇如何存儲文件,我強烈建議在本地使用簡單的基於主鍵的文件名,如'4356',將真實的文件名放在數據庫中,並使用重寫/尾隨路徑部分提供文件。 URL。 將用戶提供的文件名保存在您自己的本地文件名中是困難的,並且即使不必擔心Unicode也會導致安全災難。

正如@bobince所提到的,PHP以System Locale的指定編碼返回文件名, System Locale由非Unicode感知應用程序使用。 如果當前系統編碼中不存在該字符,則文件名將包含“?” 相反,將無法訪問。

您可以嘗試在https://github.com/kenjiuno/php-wfio上安裝php-wfio.dll ,並通過wfio://協議引用文件。

你錯過了對$ file變量的另外兩個引用,mate,但是這更好,因為我認為我可能已經發現了一種稍微更有效的方法; 嘗試一下:

<?php
if ($handle = opendir('C:/xampp/htdocs/movies')) {
    while (false !== ($file = readdir($handle))) {
        $file = mb_substr($file, mb_strrpos($file, '/') + 1);
        if ($file != "." && $file != "..") {
            echo $file . "<br />\n";
        }
    }
    closedir($handle);
}
?>

mb_substr($ file,mb_strrpos($ file,'/')+ 1)替換$ file的任何實例,你應該好好去。 Huzzah用於多字節編碼!

我認為Windows使用UTF-16作為文件名。 因此,請嘗試使用mb_convert_encoding函數將內部編碼轉換為輸出編碼:

// convert from UTF-16 to UTF-8
echo mb_convert_encoding($file, 'UTF-8', 'UTF-16');

也許你必須先改變一些設置(參見mb_get_info )。

抱歉:)

嘗試這個:

<?php if ($handle = opendir('C:/xampp/htdocs/movies')) { while (false !== ($file = readdir($handle))) { $filename_utf16 = iconv( "iso-8859-1", "utf-16", $file); if ($filename_utf16 != "." && $filename_utf16 != "..") { echo $filename_utf16 . "<br />\\n"; } } closedir($handle); } ?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM