[英]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.