Dies hängt mit diesem Stapelüberlauf-Beitrag zusammen:
glob () kann unter Windows keine Dateinamen mit Multibyte-Zeichen finden?
Ich habe Probleme mit PHP und Dateien mit Multibyte-Zeichen unter Windows. Hier ist mein Testfall:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Richtige Ausgabe auf einem Remote-UNIX-Server:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
Lokale Ausgabe unter Windows falsch :
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
Hier ist ein relevanter Auszug aus der Antwort, die ich akzeptiert habe (was eigentlich ein Zitat aus einem Artikel ist, der vor über 2 Jahren online gestellt wurde):
Aus den Kommentaren zu diesem Artikel: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Die Ausgabe Ihrer PHP-Installation unter Windows ist leicht zu erklären: Sie haben die falsche Version von PHP installiert und eine Version verwendet, die nicht für die Verwendung der Unicode-Version der Win32-API kompiliert wurde. Aus diesem Grund verwenden die von PHP verwendeten Dateisystemaufrufe die ältere "ANSI" -API, und daher versuchen die mit dieser PHP-Version verknüpften C / C ++ - Bibliotheken zunächst, Ihre UTF-8-codierte PHP-Zeichenfolge in die lokale "ANSI" -Konvertierung zu konvertieren. In der laufenden Umgebung ausgewählte Codepage (siehe CHCP-Befehl, bevor PHP über ein Befehlszeilenfenster gestartet wird)
Ihre Windows-Version ist wahrscheinlich NICHT für diese seltsame Sache verantwortlich. Tatsächlich ist dies IHRE Version von PHP, die nicht korrekt kompiliert wurde und die ältere ANSI-Version der Win32-API verwendet (aus Kompatibilitätsgründen mit den älteren 16-Bit-Versionen von Windows 95/98, deren Dateisystemunterstützung im Kernel tatsächlich keine direkte hatte Unterstützung für Unicode, jedoch Verwendung einer internen Konvertierungsschicht zum Konvertieren von Unicode in die lokale ANSI-Codepage vor Verwendung der tatsächlichen ANSI-Version der API).
Kompilieren Sie PHP mit der Compiler-Option neu, um die UNICODE-Version der Win32-API zu verwenden (dies sollte heute der Standard sein und ohnehin immer der Standard für PHP, das auf einem Server installiert ist, der NIEMALS Windows 95 oder Windows 98 sein wird ...).
Ich kann nicht bestätigen, ob dies mein Problem ist oder nicht. Ich phpinfo()
habe etwas Interessantes benutzt und fand es nicht interessant, aber ich war mir nicht sicher, wonach ich suchen sollte. Ich habe XAMPP für einfache Installationen verwendet, daher bin ich mir nicht sicher, wie es genau installiert wurde.
Ich verwende Windows 7, 64-Bit - verzeihen Sie also meine Unwissenheit, aber ich bin mir nicht einmal sicher, ob "Win32" hier relevant ist. Wie kann ich überprüfen, ob meine aktuelle Version von PHP mit der oben genannten Konfiguration kompiliert wurde?
- PHP-Version : 5.3.8
- System : Windows NT WES-PC 6.1 Build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Herstellungsdatum : 23. August 2011 11.47.20
- Compiler : MSVC9 (Visual C ++ 2008)
- Architektur : x86
- Befehl konfigurieren :
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
Falls es relevant ist oder nützliche Informationen enthält, hier ein Screenshot von mir phpinfo()
(Abschnitt mbstring):
Wie kann ich herausfinden, ob meine PHP-Installation "mit der UNICODE-Version der Win32-API kompiliert" wurde? (Und macht das überhaupt Sinn?)
quelle
Antworten:
Ich denke, Sie sollten eine offizielle Binärdatei aus dem PHP Windows-Repository herunterladen und installieren (beachten Sie den Installationspfad).
Danach müssen Sie Apache so konfigurieren, dass die neue Binärdatei anstelle der standardmäßig verwendeten verwendet wird. Es ist einfach:
Suchen Sie Ihre
httpd.conf
Datei im WAMP-Ordner (etwa C: \ wamp \ bin \ apache \ ApacheXXX \ conf \ httpd.conf). Möglicherweise können Sie auch das Trayicon durchsuchen.Ok, jetzt, wo Sie es gefunden haben, suchen Sie eine übereinstimmende Zeichenfolge
LoadModule php5_module
Gut, ersetzen Sie einfach diese Zeile durch Ihre neue,
php5_module
die sich wahrscheinlich in c: /php/php5apache2_2.dll befindet (Sie haben den Installationspfad gespeichert!). Das Ergebnis ist so etwas wieLoadModule php5_module "c:/php/php5apache2_2.dll"
Voila. Setzen Sie den Wamp-Server zurück und testen Sie Ihre Anwendung mit der neuesten Version von PHP Build speziell für Windows.
Ich bin nicht sicher, ob dies Ihr Problem lösen wird, aber es ist sicherlich ein echter Weg. Wenn Sie Probleme mit dem PHP-Setup haben, lesen Sie diesen Artikel .
Viel Glück!
quelle
Es scheint, als ob diese Frage schon eine Weile da draußen ist und ob PHP mit Unicode-Flags kompiliert wurde oder nicht, hat keinen Einfluss auf die Unicode-Unterstützung, aber wenn Sie feststellen müssen, ob ein bestimmtes PE-Image wahrscheinlich gegen die Unicode-Version von kompiliert wurde Mit der Windows-API können Sie die verwendeten
dumpbin
Kernel32.dll-Importe untersuchen. Dies ist nicht genau etwas, was ich pragmatisch tun würde, aber zur Not könnte es für die Diagnose funktionieren.Eine ausführbare Unicode-Datei könnte beispielsweise Folgendes auflisten:
Notieren Sie die Anzahl der Funktionen, die mit W enden, auch bekannt als Wide für Unicode-Zeichen.
Bei einer ausführbaren ANSI-Datei oder DLL sehen Sie möglicherweise etwas näheres an:
Da die meisten Funktionen mit A enden, können wir sehen, dass die ausführbare Datei höchstwahrscheinlich mit ANSI-Flags kompiliert wurde.
quelle
Hier ist ein Code, an dem ich gearbeitet habe, um ein
mbstring
Problem zu lösen, auf das ich gestoßen bin. Am Ende durchlief ich jede Kombination von Codierungen und Optionen, bis eine von ihnen die Ausgabe präsentierte, die ich brauchte. Ich habe das Gefühl, dass diese Art von Verfahren Ihnen helfen könnte, die Antwort zu finden, die Sie suchen.Verlassen Sie sich nicht auf die Dokumentation , da in meinem Fall die Ergebnisse nicht den Erwartungen und Codierungen entsprachen. Ich erinnere mich, dass ich bei meinen Tests die Rechtecke, s und Dinge wie A ~ bekommen würde. Meine Tests waren genau wie deine,
print_r
die Info. In meinem Fall importiert mein Skript Kunden- und Verkaufsinformationen in Quickbooks, die UTF-8 nicht verarbeiten können. (Entweder QB selbst kann nicht oder der QODBC-Treiber kann nicht) Tildes, Gräber und Umlats kommen nicht in Frage.Dieser Link oben lautet http://www.php.net/manual/en/function.mb-detect-encoding.php#89915. Wenn Google Sie hier findet, lesen Sie ihn auf jeden Fall.
quelle
Ich glaube, Sie sollten überprüfen, ob PHP mit mbstring kompiliert wurde (oder ob das mbstring-Modul installiert und aktiviert ist, wenn Sie Module verwenden). Wenn Sie diese Erweiterung aktiviert haben, sollten Sie Ihre Probleme lösen. Diese Seite sollte Ihnen alles erzählen, was Sie wissen müssen, damit es funktioniert.
quelle