Arbeiten mit japanischen Dateinamen in PHP 5.3 und Windows Vista?

Lesezeit: 3 Minuten

Arbeiten mit japanischen Dateinamen in PHP 53 und Windows Vista
Jon

Ich versuche derzeit, ein einfaches Skript zu schreiben, das in einem Ordner nachsieht und eine Liste aller Dateinamen in einem RSS-Feed zurückgibt. Ich bin jedoch an eine große Wand gestoßen … Immer wenn ich versuche, Dateinamen mit japanischen Zeichen darin zu lesen, werden sie als ? angezeigt. Ich habe die hier genannten Lösungen ausprobiert: php readdir Problem mit japanischem Sprachdateinamen – sie funktionieren jedoch aus irgendeinem Grund nicht, selbst mit:

header('Content-Type: text/html; charset=UTF-8');
setlocale(LC_ALL, 'en_US.UTF8');
mb_internal_encoding("UTF-8");

Oben (Als Klartext exportieren, bis ich das sortieren kann).

Was kann ich tun? Ich brauche das zum Arbeiten und habe nicht viel Zeit.

  • haben Sie versucht zu sehen, welche Seiteneigenschaften Sie erhalten? Mit Firefox (Rechtsklick – Seiteninfo) und Sie müssen Encoding: UTF-8 haben, sonst stimmt etwas in Ihren Headern nicht.

    – Mihai Iorga

    22. Mai ’10 um 11:46


  • Ich glaube nicht, dass es dafür eine Lösung gibt. PHP verwendet die Unicode-Versionen von Windows-APIs intern nicht und die Multibyte-Versionen akzeptieren UTF-8 nicht als Codepage.

    – Artefakt

    22. Mai ’10 um 12:05

1641741866 711 Arbeiten mit japanischen Dateinamen in PHP 53 und Windows Vista
ano

function fx_dir_utf8 ($path)
{
    // use this as failback on windows for usual dir listing
    // give it a UTF-8 path and receive a UTF-8 listing
    $path       = iconv ('UTF-8', 'UTF-16LE', $path);
    $cmd        = 'cmd /U /C dir '. str_replace ("https://stackoverflow.com/", '\', $path);
    // windows command line returns CP850 or UTF-16LE
    $dir_str    = shell_exec ($cmd);
    $dir_str    = iconv ('UTF-16LE', 'UTF-8', $dir_str);
print_r ($dir_str);

    // further parse $dir_str
    return ($dir_str);
}

Das ist nicht möglich. Es ist eine Einschränkung von PHP selbst. PHP verwendet nicht die breiten WIN32-API-Aufrufe, daher sind Sie durch die Codepage eingeschränkt. UTF-8 (65001) ist hierfür nicht gültig.

Wenn Sie einen Haltepunkt auf setzen readdir_r() in win32readdir.c, das wirst du sehen FindNextFile gibt bereits einen Dateinamen mit Fragezeichen anstelle der gewünschten Zeichen zurück, sodass Sie nichts dagegen tun können, außer PHP selbst zu patchen.

  • Nun, das ist scheiße … Da PHP keine Option ist, was wäre eine alternative Sprache, die die Dateinamencodierung von Windows handhabt? Ich muss nur einen RSS-Feed mit Dateinamen in einem Ordner exportieren (zusammen mit dem genauen Pfad und einigem anderen einfachen Text).

    – Jon

    22. Mai ’10 um 12:41

  • Ich schlage vor, Sie verwenden Java. ROM (rom.dev.java.net) ist eine sehr gute RSS-Bibliothek.

    – Artefakt

    22. Mai ’10 um 12:45

Dadurch werden japanische Dateinamen auf einem Windows-Server korrekt angezeigt

if ($handle = opendir($this->dir)) {
    while (false !== ($file = readdir($handle))){
        $name = mb_convert_encoding($file, "UTF-8", "SJIS-win" );
        echo "$name<br>";
    }
    closedir($handle);
}

Ja, nein, wie andere schon sagten, PHP KIPPEN Tu es… Schade um dich PHP!

Wie andere auch vorgeschlagen haben, könnte eine Alternative darin bestehen, einen Proxy in einer anderen Sprache zu schreiben, der diese Dateinamen lesen kann:

Einige schlugen C vor, aber ich persönlich fand Python viel einfacher/attraktiver (hier Python3).

** STELLEN SIE SICHER, DASS SIE IHRE VARIABLEN VOR DER VERWENDUNG DES BENUTZENS DESINFINIEREN **

$success = (bool)(int)shell_exec('python -c "import os;'.
    'os.chdir(''.$dir.''); '.
    'import urllib.parse; '.
    'file_list = tuple(map(urllib.parse.quote_plus, os.listdir())); '.
    'print(int(''.urlencode($_GET['src']).'' in file_list and ''.urlencode($_GET['src'].'.part').'' not in file_list))"'
);

Ja, nicht schön, aber mit diesem Schnipsel konnte ich die Dateinamen überprüfen von urlencode‘ing sie.

(Ndl: Dieses spezielle Snippet wurde verwendet, um herauszufinden, wann eine Datei mit Firefox heruntergeladen wurde, ohne sich mit der API herumschlagen zu müssen. Nicht das Beste, aber FUNKTIONIERT und schnell einzurichten)

Sie können es in PHP tun. Schreiben Sie ein kleines C-Programm zum Lesen von Verzeichnissen und rufen Sie dieses Programm von PHP aus auf.

Siehe auch:
http://en.literateprograms.org/Directory_listing_(C,_Windows)
http://www.daniweb.com/forums/thread74944.html
http://forums.devshed.com/c-programming-42/reading-a-directory-in-windows-36169.html

  • Du nennst dies tun es in PHP? :p Es ist jedoch eine akzeptable Problemumgehung.

    – Artefakt

    9. August ’10 um 23:01

  • Du nennst dies tun es in PHP? :p Es ist jedoch eine akzeptable Problemumgehung.

    – Artefakt

    9. August ’10 um 23:01

.

221150cookie-checkArbeiten mit japanischen Dateinamen in PHP 5.3 und Windows Vista?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy