keyboarder: utf-8 und/oder ansii

Hallo zusammen,

ich habe eine allgemeine Frage. Ich habe derzeit mehrere PHP-Projekte mit unterschiedlichen Datenbank-Systemen (mySQL, MSSQL, ORACLE), je nach Kunde. Bei einigen Kunden werden die Daten als utf-8 gespeichert, bei anderen als ansii. Prinzipiell ist das klein Problem und alle Applikationen funktionieren auch so wie sie sollen.

Ich habe verschiedene Bibliotheken, die ich in allen Applikationen benutze. Aber bei Funktionen, die mit Texten arbeiten muss ich bei den einen Programmen z. B. mb_strpos und bei anderen strpos verwenden (abgesehen davon, dass ich einmal mb_internal_encoding("UTF-8"); setzen muss).

Und jetzt die Frage: Gibt es eine Möglichkeit, so eine Bibliothek in beiden Applikationstypen zu benutzen, ohne dass ich jedesmal ein Ersetzen aller mb_xxx in die xxx Funktionen vornehmen muss?

Möglich wäre z. b. eine superglobale Variable und dann einzeln abfragen, wie z. B.
 if ($USE_UTF8) return mb_strlen($a);
 else return strlen($a);
aber das ist wirklich nicht sehr schön und außerdem vermute ich, dass es das Programm ausbremst.

Vielleicht hat ja jemand eine andere Idee.

Im Voraus vielen Dank,

Joachim

  1. Hi!

    Hallo zusammen,

    ich habe eine allgemeine Frage. Ich habe derzeit mehrere PHP-Projekte mit unterschiedlichen Datenbank-Systemen (mySQL, MSSQL, ORACLE), je nach Kunde. Bei einigen Kunden werden die Daten als utf-8 gespeichert, bei anderen als ansii. Prinzipiell ist das klein Problem und alle Applikationen funktionieren auch so wie sie sollen.

    Ich habe verschiedene Bibliotheken, die ich in allen Applikationen benutze. Aber bei Funktionen, die mit Texten arbeiten muss ich bei den einen Programmen z. B. mb_strpos und bei anderen strpos verwenden (abgesehen davon, dass ich einmal mb_internal_encoding("UTF-8"); setzen muss).

    Und jetzt die Frage: Gibt es eine Möglichkeit, so eine Bibliothek in beiden Applikationstypen zu benutzen, ohne dass ich jedesmal ein Ersetzen aller mb_xxx in die xxx Funktionen vornehmen muss?

    Möglich wäre z. b. eine superglobale Variable und dann einzeln abfragen, wie z. B.

    Es gibt nur die von PHP her bekannten superglobalen Variablen. Für Anwender gibt es lediglich Konstanten, die überall verfügbar sind.

    if ($USE_UTF8) return mb_strlen($a);
    else return strlen($a);
    aber das ist wirklich nicht sehr schön und außerdem vermute ich, dass es das Programm ausbremst.

    Wenn sich der if-Zweig garantiert mit return beendet, kannst du den restlichen Code ohne else notieren. Zu Verzögerungen wird das sicherlich führen - jeder Code braucht Abarbeitungszeit - die Frage ist, ab wann ist es bemerkbar. Und das wird es erst bei sehr vielen Aufrufen.

    Lo!

    1. Hallo dedlfix,

      danke für die schnelle Antwort. Ober superglobale (z. b. $_SESSION["UTF")) oder globale Variable (z. B. $USE_UTF) oder Konstante (z. b. define("UTF","1")) ist egal, wenn es fuktioniert :-)

      Mit dem "ab wann ist es bemerkbar" hast Du schon recht. Da es sich ja überall nur um String-Funktionen handelt, werden die Funktionen sicher nicht allzu oft benötigt. Vermutlich wird man selbst Tausende Abfragen zeitlich nicht bemerken. Aber schön ist es trotzdem nicht... ;-)

      Gruß,

      Joachim

  2. Yerf!

    Ist es nicht egal, wie die Daten gespeichert wurden? Du verhandelst doch bei deiner Verbindung mit der Datenbank die gwünschte Codierung aus, die datenbank konvertiert also notfalls.

    Ansonsten kannst du theoretisch auch in PHP per mb_internal_encoding("iso-8859-1");  auch die mb_ Funktionen für ISO nehmen. Allerdings sollten dann keine Texte direkt im Quellcode stehen. Siehe Anmerkung im Handbuch.

    Gruß,

    Harlequin

    --
    RIP --- XHTML 2
    nur die Besten sterben jung