Unicode-Support in PCRE fehlerhaft

  • Liebes Forum,


    ich bin auf der QNAP, die ich administriere, auf ein Problem mit dem Unicode-Support der PCRE-Bibliothek gestoßen. Ich beobachte in meinen PHP-Applikationen genau den Fehler, der in der Diskussion eines Bugs in CakePHP beschrieben wird.


    Das Problem scheint darauf zurückzuführen zu sein, dass die Verwendung der Funktionen der PCRE-Bibliothek bei Strings in Unicode-Codierung zu unerwarteten Ergebnissen führt. Ein User in dem Bug-Thread berichtet, dass er das Problem beheben konnte, indem er die PCRE-Bibliothek mit einem anderen Flag neu kompiliert hat.


    Er schreibt:

    Zitat

    The problem was with pcre library which was compiled with --enable-utf8 and it should be with --enable-unicode-properties. This allows using extra escape sequences like \p{xx}, \P{xx}, \X. More information can be found http://www.pcre.org/pcre.txt. I'm using slackware-current to anyone who might be interested.


    phpinfo() auf meinem QNAP ausgeführt zeigt mir PHP Version 5.2.14 und PCRE Version 8.02. Aber kann ich auch irgendwie herausfinden, mit welchen Flags die auf meinem Server verwendete PCRE-Bibliothek kompiliert wurde?


    Das Gerät ist eine TS-859U-RP+ mit (derzeit aktueller) Firmware 3.4.4 Build 0718T.

  • Terz, vielen Dank für Deine Antwort.


    Entweder habe ich Deine Antwort, oder Du meine Frage nicht richtig verstanden. Vielleicht habe ich mich nicht deutlich genug ausgedrückt.


    Ich weiß bereits, dass das Pattern Matching mit der PCRE-Bibliothek auf meiner QNAP nicht richtig funktioniert. Ich versuche nun bloß herauszufinden woran das genau liegt.


    Eine Möglichkeit wäre, dass die PCRE-Bibliothek mit dem Flag --enable-utf8 statt mit dem Flag --enable-unicode-properties kompiliert wurde.


    Zumindest berichtet jemand in dem Bug-Thread, den ich oben verlinkt habe, dass er das Problem lösen konnte, indem er die PCRE Bibliothek erneut mit letzterem statt ersterem Flag kompiliert hat. Bevor ich nun weitere Schritte überlege, würde ich gerne herausfinden, mit welchem Flag die PCRE Bibliothek auf meiner QNAP kompiliert wurde. Dazu konnte ich auf der von Dir verlinkten PHP-Manual-Seite keine Informationen finden.


    Mit

    Code
    php -i

    konnte ich weder das eine noch das andere Flag finden, was aber vielleicht daran liegt, dass PCRE ein Modul ist?


    Mit

    Code
    php -m

    kann man zwar die Module, die mit PHP mitkompiliert wurden anzeigen lassen, nicht aber deren Compile-Flags...

  • Hi,


    no Problem.


    Schaue mal:

    Zitat

    Eine Möglichkeit wäre, dass die PCRE-Bibliothek mit dem Flag --enable-utf8 statt mit dem Flag --enable-unicode-properties kompiliert wurde.


    Genau das kann man damit Prüfen.


    Beispiel:

    PHP
    <?php
      if (@preg_match('/\pL/u', 'a') == 1) {
        echo "PCRE unicode support is turned on.\n";
      } else {
        echo "PCRE unicode support is turned off.\n";
      }
    ?>


    Probiere das mal aus.
    Alternativ könntest Du mal pcre aus der optware ziehen und mit den commandline tools schauen, ob unicode "enabled" oder disabled ist.


    Grüsse, David

  • Vielen Dank für die Hilfe.


    Die Sache ist die, dass es für mich so aussieht, also ob "Unicode-Support" nicht gleich "Unicode-Support" ist. Der von Dir vorgeschlagene Test ist bei mir erfolgreich. Die PCRE-Lib auf meiner QNAP hat definitiv Unicode-Support. Und trotzdem kann ich den oben verlinkten Bug in CakePHP reproduzieren, den die CakePHP-Entwickler auf einen fehlerhaften (und nicht einen nicht-vorhandenen...) Unicode-Support in PCRE schieben.


    Keine Ahnung, wie ich da jetzt weitermachen soll.


    Beste Grüße
    Moritz

  • Hi,


    Unicode ist schnon Unicode. Also entweder oder.
    Nicht auszuschliessen ist es aber, dass es eventuell einen "Bug" in Pcre gab. Letztendlich wird ja auch PCRE so wie jede Lib immer geupdated und hat einen trac.
    Probiere es mal mit den IPKG Paketen. Wenn nicht halt selbst bauen.


    ggf. gibt's im Trac von CakePHP auch noch was dazu.
    Du solltest ja zumindest einen Hinweis sehen, sobald pcre nicht mit unicode kompiliert wurde. (in Gelb auf der WebSite).


    Grüsse, David

  • Naja, das IPKG-Paket für PCRE habe ich schon installiert.

    Code
    pcregrep --version


    zeigt mir Version 8.12 an.

    Code
    phpinfo()


    dagegen zeigt wie gesagt 8.02 an.


    Es müssen also zwei Versionen installiert sein. Ich glaube nicht, dass man über die php.ini PHP sagen kann, welche PCRE Installation es benutzen soll, jedenfalls konnte ich nichts dementsprechendes finden. Selbst kompilieren oder generell "unter der Haube", also am Web-Interface der QNAP vorbeikonfigurieren ist für mich nicht wirklich eine Option, da solche Änderungen meiner Erfahrung nach nach jedem Firmware-Update, teilweise sogar nach einem einfach Reboot, vom System überschrieben werden.


    Wie gesagt: Die verwendete PCRE-Lib unterstützt Unicode. Vielleicht ist in der installierten Version ein Bug. Allerdings berichten in dem Thread zu dem CakePHP-Ticket, das ich oben verlinkt habe, User, dass der Bug mit Version 8.02 von PCRE bereits behoben sein sollte. Trotzdem kann ich ihn reproduzieren. Deswegen kam ich auf die Sache mit den Compile-Flags.

  • Wenn Du pcre aus dem ipkg feed nutzen möchtest, müsstest Du dir natürlich den apache und php auch aus der Optware installieren.


    Habs auch mal ausprobiert.

    Code
    pcretest -C


    Zitat

    No Unicode properties support


    Also bringt auch die installation aus der optware nix.
    Die änderungen bleiben natürlich erhalten, wenn Du einfach den Pfad /opt nutzt.
    Welche version QNAP auf dem "default" Apache nutzt wissen nur die, bzw. Könnte man via den GPL Quellen ermitteln.


    Um ein kompilieren wird man nicht vorbei kommen.


    Grüsse, David

  • Die Sache wird noch dadurch etwas komplizierter, dass der Bug genau genommen beim verweden der cake shell auftritt, welche wiederum den PHP-Kommandozeilen-Interpreter verwendet, welcher ja durchaus ein anderer sein kann als der PHP-Interpreter der von Apache verwendet wird.


    Der Befehl

    Code
    pcretest -C

    ist ein sehr wertvoller Hinweis! Das gibt bei mir auch aus:

    Code
    Compiled with
      UTF-8 support
      No Unicode properties support


    Am schönsten wäre aus meiner Sicht natürlich, wenn man QNAP dazu bewegen könnte, PCRE für das nächste Firmware-Update mit dem entsprechenden Flag zu kompilieren.


    Ob dafür eine realistische Chance besteht? Was wäre wohl der beste Weg einen Feature Request an die zu stellen?

  • QNAP hat php und Pcre mit Unicode Support kompiliert, sonst würde das obige Script:
    http://forum.qnapclub.de/viewtopic.php?f=45&t=16982#p93939


    Zitat

    PCRE unicode support is turned off


    anzeigen.


    Im Paket aus der NSLU2 COmmunity ist es deaktiviert. Ist usersubmitted (alles aus der Optware). Also entweder es liegt an der "Version" von pcre oder aber an cakePHP.
    Mit ZF gibt's keine Probleme.


    Grüsse, David

  • Diese NSLU2-Community stellt also die Pakete für das IPKG-System der QNAP-Geräte her? Dann müsste ich wohl dort anfragen, ob sie PCRE für die nächste Version mit dem Unicode-Properties-Flag kompilieren könnten?


    Wäre ich damit hier an der richtigen Adresse? http://www.nslu2-info.de

  • So ähnlich.
    Ich denke nicht, dass Du da grosse Chancen hast ^^


    http://www.nslu2-linux.org/
    Die Pakete werden von Usern für User kompiliert. Im Prinzip kannstes deshalb selbst machen ^^
    Oder aber Du suchst Dir den Maintainer des jeweiligen Paketes auf und versuchst es darüber.


    Grüsse, David