Wie kann ich überprüfen, ob PHP mit der UNICODE-Version der Win32-API kompiliert wurde?

10

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):

phpinfo Screenshot

Wie kann ich herausfinden, ob meine PHP-Installation "mit der UNICODE-Version der Win32-API kompiliert" wurde? (Und macht das überhaupt Sinn?)

Wesley Murch
quelle
5
Upvoted, weil Wesleys aufeinander aufpassen müssen.
Wesley
Haben Sie in Ihrem Skript etwas in Bezug auf die Codierung getan? Ich hatte das Gegenteil von diesem Problem mit meiner Win7-64-Installation! Php las die Umlats & all das & das Mist-Legacy-Programm, mit dem ich kommunizierte, mit Pausen, wenn es diese bekam.
Chris K
Es tut mir leid, diese Frage zu beantworten. Ich habe einfach nicht die erhoffte schnelle und schmutzige Antwort erhalten und schließlich die Entwicklung dieses Projekts unter Windows eingestellt. Ich werde PHP 5.4 bald lokal (unter Windows) installieren, sodass die Frage für mich möglicherweise nicht mehr wertvoll ist, wenn jemand eine akzeptierte Antwort vorschlagen möchte, bin ich ganz Ohr. In der Zwischenzeit Upvotes und vielen Dank.
Wesley Murch

Antworten:

3

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.confDatei 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_moduledie 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!

Thiago Macedo
quelle
2

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 dumpbinKernel32.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:

               4C CreateFileMappingW
               45 CreateDirectoryW
               33 CompareStringW
              12E GetCurrentDirectoryW
               AF ExpandEnvironmentStringsW
              2F0 SetFileAttributesW

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:

              30A SetCurrentDirectoryA
              15E GetFileAttributesA
              171 GetLastError
               4B CreateDirectoryA
              319 SetFileAttributesA

Da die meisten Funktionen mit A enden, können wir sehen, dass die ausführbare Datei höchstwahrscheinlich mit ANSI-Flags kompiliert wurde.

Mitch
quelle
2

Hier ist ein Code, an dem ich gearbeitet habe, um ein mbstringProblem 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_rdie 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.

setlocale(LC_CTYPE, 'en_US.UTF-8');
$xmlstr=file_get_contents($file);           
// convert character encoding to get rid of accents, etc
// see http://www.php.net/manual/en/function.mb-detect-encoding.php#89915
// note that unlike ASCII//TRANSLIT and ASCII//TRANSLIT//IGNORE do not work
// in windows 7.
$xmlstr=iconv('UTF-8', 'ASCII//IGNORE', $xmlstr);   

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.

Chris K.
quelle
1

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.

Aaron
quelle
Vielen Dank für den Vorschlag, aber ich glaube, mbstring ist korrekt installiert. Ich habe diesbezüglich am Ende meines Beitrags ein paar Infos hinzugefügt. Ich bin mehr daran interessiert, mehr über die Kommentare zu erfahren, die ich aus dem Artikel "IHRE Version von PHP, die nicht korrekt kompiliert wurde und die die ältere ANSI-Version der Win32-API verwendet" zitiert habe , wie man herausfindet, ob dies der Fall ist, und ob dies relevant ist oder nicht.
Wesley Murch
Ich denke nicht, dass die Unicode-Unterstützung in PHP viel mit der Unicode-Unterstützung in der API zu tun hat, mit der PHP seine Geschäfte abwickelt. Ich vermute, dass Letzteres eher das Problem ist als Ersteres. (Tut mir leid, dass ich keine Antwort auf das Problem habe. Ich bin angewidert darüber, wie schrecklich PHP ist, nachdem ich vernünftige Sprachen ausprobiert habe, daher habe ich nicht so viel Erfahrung damit.)
Eltern