Japonca dil dosyası adı ile php readdir sorun

7 Cevap php

Ben aşağıdaki kodu var

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

Böyle japon gibi mb dili var yaptığında, o kyuukyoku Choujin R gibi gösterilecek düzgün yerine görünmüyor??? ~? ziyade kyuukyoku Choujin R 究極 超人 あ ~ る

Neyse doğru adını görüntülemek veya hala download-güçlü başkaları tarafından make için?

Bana yardım ettiğin için teşekkürler :)

7 Cevap

Ben PHP için kesin konuşamam, ama Python 2 ile aynı temel sorun sanıyorum (daha önce daha sonra Unicode dize dosya için özel destek ekleyerek) vardı.

Benim inancım PHP open'-et-al bayt-tabanlı işlevler, standart C kütüphanesi 'kullanarak dosya ile ilgili olmasıdır. Windows (NT) bu sistemin kod sayfasını kullanarak gerçek Unicode dosya kodlamak için deneyin. Batılı makineleri (ISO-8859-1 benzeri) cp1252, ya da Japon makinelerde (-Shift JIS benzer) CP932'den olabilir. Sistem kod sayfasında mevcut olmayan herhangi bir karakter için, '?' Karakterini bir alacak, ve bu dosyaya başvurmak mümkün olacak.

Bu sorunu aşmanın PHP Python 3.0 olarak aynı yapmak ve Windows altında dosya için yerel Unicode erişmek için '_wopen'-et-al işlevleri kullanarak, dosya adları (ve her şey) için Unicode dizeleri kullanmaya başlamak gerekir. Ben bu PHP6 ne olacağını bekliyoruz, ama şu an için muhtemelen oldukça fazla dolması demektir. Sen dosya erişmek için CP932'den için sistem kod sayfasını değiştirmek olabilir, ama yine de olsun istiyorum '?' Eğer gerçekten don't istemiyorum Shift-JIS, ve her durumda herhangi başka bir Unicode karakter karakterler uygulamanızın iç dizeler yapmak için tüm Shift-JIS oldukça korkunç bir kodlama olduğu gibi.

Bu dosyaları saklamak için nasıl seçerek kendi komut varsa, ben kuvvetle yolu parçaları firar / yeniden yazar kullanarak, yerel '4356 gibi basit birincil anahtar tabanlı dosya adlarını 'kullanarak bir veritabanında gerçek dosya adını koyarak ve dosyaları hizmet öneririm URL. Kendi yerel dosya kullanıcı tarafından sağlanan dosya adlarını tutulması bile Unicode hakkında endişelenmenize gerek kalmadan zor ve güvenlik afetler için bir reçetedir.

mb_substr($file, mb_strrpos($file, '/') + 1) ile $file herhangi bir örneğini değiştirin ve gitmek için iyi olmalıdır. Huzzah çok bayt kodlama için!

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

Hala çalışmıyor bulunuyor. BT bana hala aynı dosya vermek

Sen $file değişkeni, çiftleşmek için diğer iki başvurular cevapsız, ama ben biraz daha verimli bir yöntem keşfetti may've düşünüyorum o daha iyi olduğunu; Bu deneyin:

<?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);
}
?>

Veri çıkışı öncesi uygun bir HTTP Content-Type üstbilgisi ayarladınız mı? Gibi:

header('Content-Type: text/html; charset=UTF-8');

Ben bir tarayıcıda, yani charset belirterek çok önemli olduğunu, eko-ing zannederler.

üzgünüm :)

Bu çalışır:

<?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); } ?>