strcoll und setlocale unter Mac OS X
Ich sitze gerade an einem blödem Problem und weiß nicht, ob es ein Bug in PHP ist oder ob ich mich nur zu dumm anstelle. Normalerweise sollte man mit strcoll() zwei Strings in Abhängigkeit der eingestellten Locale vergleichen können. Folgendes UTF-8-kodiertes Testscript dafür:
PHP-Code:
Code:
Alt: C Neu: de_DE.UTF8 Code:
Alt: C Neu: de_DE.UTF-8 Grundsätzlich wäre es ja nicht so das Problem, da es ja auf dem Webserver richtig läuft. Da ich aber verschiedene größere Datenmengen lokal konvertieren will, brauche ich eine Lösung für meinen Mac. Hat irgendjemand eine Idee, warum strcoll hier auf dem Mac versagt? Mario |
Zitat:
OSX kenne ich nicht wirklich, aber kann es eventuell sein, dass du die Schreibweisen genau vertauscht hast? |
Nein, dass mit der Locale passt schon. locale -a liefert mir unter Linux …
Code:
de_DE@euro Code:
de_DE Die Locale stimmt also und wird richtig gesetzt. Nur interessiert das strcoll unter Mac irgendwie nicht. :( Mario |
Ein „locale | grep LC_COLLATE“ liefert mir hier:
Zitat:
Tut mir leid, eine andere Idee habe ich dazu auch nicht mehr. :| |
Ich hab es gerade noch mal probiert, unter Linux wird de_DE.UTF-8 und de_DE.UTF8 akzeptiert und strcoll liefert das richtige Ergebnis. Unter Mac liefert setlocale bei de_DE.UTF8 als Ergebnis FALSE zurück, kennt also diese Locale nicht. de_DE.UTF-8 wird dagegen richtig gesetzt, hat eben nur nicht den gewünschten Effekt und strcoll liefert ein falsches Ergebnis.
Mario |
Mal ne Frage am Rande: Schonmal in den Usercomments auf PHP: strcoll - Manual nachgeschaut? Da steht was in der Art Deines Problems drinnen, was evtl. helfen könnte. Ich habe aber keinen Plan von der Funktion, da ich das noch nie verwendet habe.
|
Das ist eigentlich nicht mein Problem. Der Kommentar beschreibt ja genau das beabsichtigte Verhalten von strcoll.
strcmp und strcoll (mit der Locale "C") vergleichen Strings nur anhand ihres numerischen Werts. Da bei ASCII das große "A" der Wert 65 hat und das kleine "a" den Wert 97 hat, ist da "a" größer als "A". Setzt man eine Locale wie "de_DE", ändert sich das Verhalten von strcoll und es vergleicht anhand der Besonderheiten der eingestellten Sprache. Da ist es nun mal so, dass ein kleines "a" auch kleiner als ein großes "A" ist und entsprechend ist das Ergebnis. Genauso will ich es, nur klappt das auf meinem Mac leider nicht. Mario |
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:41 Uhr. |
Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
© Dirk H. 2003 - 2023