Moin!
Wenn du ZEICHEN haben willst, nimm mb_substr().
und was macht man bei Funktionen für die es keine entsprechende multibyte Funktion gibt?
Siehe mein Posting hier um 13.50 str_pad() multibyte?
Da hast du eine Antwort. :)
ich habe einige Beiträge von dir gelesen in denen es um UTF8 ging.
Ich möchte dich als Experten mal gerne fragen, wie du bei einer Umstellung umgehen würdest oder umgegangen bist?
UTF-8 ist nach meiner Ansicht pflegeleichter, als es hier manchmal dargestellt wird. Das liegt zum einen daran, dass es tatsächlich vollständig bytekompatibel zu beispielsweise ISO-8859-1 ist, also keine merkwürdigen Bytes enthält, die vollkommen aus dem definierten Bereich von ISO-8859-1 herausfallen. Jedes System, was mit ISO-8859-1 grundsätzlich umgehen kann, kann auch mit UTF-8 umgehen.
Der Teufel steckt natürlich dann doch im Detail. Denn "umgehen" betrifft, wenn wir vom "Backend" sprechen, also alles, was nicht im Browser passiert, nur komplette Strings.
Ok, manche Dinge kriegt man auch ohne spezielle UTF-8-Berücksichtigung noch hin. Sortieren von Strings beispielsweise funktioniert mit ISO als auch UTF-8 prima, wenn dabei nur Bytes verglichen werden. Wenn man UTF-8 sortiert, wird eben anhand der Unicode-Codepoints aufsteigend sortiert, und der ganze Krams mit "äquivalente Zeichen", wie sie in den Sortierregeln von Sprachen vorkommen, bleiben komplett außen vor.
Außerdem profitiert man sicherlich davon, wenn eine zentrale Schaltstelle existiert, die als einzige mit den Speichersubsystemen spricht (also z.B. Datenbank oder Dateisystem). Denn da UTF-8-Strings vom Byteinhalt her auch gültiges ISO-8859-1 sind (wenngleich das nicht schön aussieht), funktionieren alle Subsysteme, die in der Lage sind, einen String entgegenzunehmen und unverändert wieder zurückzugeben.
Sprich: Es ist überhaupt kein Problem, wenn deine Dateifunktionen UTF-8-Strings als Dateinahmen verwenden, solange als einziges wieder nur dein PHP-Skript auf diese Dateinamen zugreifen will.
Problematisch wird's dann, wenn man gern möchte, dass das Subsystem von mehreren Stellen aus angezapft wird. Im Falle des Dateisystems will man also auch gerne den Explorer oder die Shell mit identischen Dateinamen beglücken. Im Falle einer Datenbank will man auch mit dem Admin-Tool korrekte Umlaute sehen, nicht nur mit dem Skript.
Und zu guter letzt: Irgendwann muss man mit den Strings auch mal mehr tun, als sie nur unverändert durchzureichen. :)
Du schreibst das Forum und Blog sind UTF8.
Richtig, aber beide Systeme nutzen bei den allermeisten Dingen kein PHP, sondern C.
Ich bin jetzt ganz am Anfang meiner Umstellung. Im Grunde müsste man doch konsequent jede Zeile Code bzw. jede String Funktion und jede Funktion die mit dem Dateisystem zu tun hat, prüfen und gegebenfall ändern.
Eine Umstellung von altem Code ist immer eine etwas schmerzhafte Angelegenheit. Es ist viel angenehmer, neuen Code direkt auf UTF-8 ausgerichtet zu schreiben - dummerweise ist das auch viel aufwendiger.
Du brauchst, wenn du mit Dateisystemen operierst, ja ohnehin eine Filterfunktion, um Zeichen zu behandeln, die sich für die Verwendung in Dateinamen nicht eignen. Und genau diese Funktion wird umgestellt von "kriegt ISO-8859-1 und macht einen Dateinamen draus" auf "kriegt UTF-8 ...". Das ist ein relativ kleiner Schritt.
PHP bietet übrigens an, die normalen Stringfunktionen (aber leider nicht alle, nur die, für die es mb_*-Ersatz gibt) direkt zu überladen, d.h. sie verhalten sich dann multibyte-kompatibel. Siehe http://de3.php.net/manual/en/mbstring.overload.php. Der einzige zusätzliche Schritt wäre dann, mb_internal_encoding('UTF-8'); aufzurufen, damit man das Encoding des verwendeten Strings nicht jedesmal manuell angeben muss.
Das Überladen der ereg-Funktionen ist übrigens nicht notwendig. Erstens ist ereg böse, zweitens seit 5.3.0 deprecated (fliegt also raus), und drittens sollte man ja sowieso preg-Funktionen verwenden, die schon lange auch einen Unicode-Modifier anbieten. Und außerdem auch einen passenden Such-Pattern für bestimmte Unicode-Zeichen-Eigenschaften: \p bzw. \P - damit kann man dann beispielsweise nach "Buchstaben" suchen, ohne alle Unicode-Buchstaben in einer Zeichenklasse auflisten zu müssen.
Ja, Unicode bzw. UTF-8 fällt nicht so ohne weiteres aus der Tüte, man muss an gewissen Stellen schon etwas mehr nachdenken und aufpassen. Andererseits erleichtert es grundsätzlich die Arbeit in so einem Maße, dass ich persönlich nicht drauf verzichten möchte. Deshalb halte ich es auch für extrem unrealistisch, dass irgendein UTF-8-fähiges System tatsächlich irgendwann nochmal zurück auf ISO-8859-1 getrimmt wird. Allein schon des fehlenden Eurozeichens wegen.
- Sven Rautenberg