XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   strcoll und setlocale unter Mac OS X (http://xhtmlforum.de/showthread.php?t=57072)

netspy 18.05.2009 21:09

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:

<?php

if (defined('PHP_OS')) {
    if (
stristr(PHP_OS'darwin')) {
        
$locale 'de_DE.UTF-8';
    } elseif (
stristr(PHP_OS'win')) {
        
$locale 'German_Germany.65001';
    } else {
        
$locale 'de_DE.UTF8';
    }
} else {
    
$locale 'de_DE.UTF8';
}

$string "abcdefghijklmnopqrstuvwxyzäöüß";

$array = array();

for (
$i=0$i<mb_strlen($string'UTF-8'); $i++) {
    
$array[]=mb_substr($string$i1'UTF-8');
}

$oldLocale setlocale(LC_COLLATE"0");

print(
"\nAlt: $oldLocale Neu: ");
print(
setlocale(LC_COLLATE$locale));
usort($array'strcoll');
setlocale(LC_COLLATE$oldLocale);
print(
"\n" implode(''$array) . "\n");

?>

Auf meinem Webserver (Linux, PHP 5.2.6) liefert mir das auch wie erwartet folgende Ausgabe:
Code:

Alt: C Neu: de_DE.UTF8
aäbcdefghijklmnoöpqrsßtuüvwxyz

Die Umlaute sind also richtig einsortiert. Auf meinen Entwicklungsrechner (Mac OS X, PHP 5.2.8) sieht das Ergebnis dagegen so aus:
Code:

Alt: C Neu: de_DE.UTF-8
abcdefghijklmnopqrstuvwxyzßäöü

Die Umlaute sind hinten angehangen und nicht richtig einsortiert.

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

inta 18.05.2009 21:38

Zitat:

Zitat von netspy (Beitrag 433449)
Auf meinem Webserver (Linux, PHP 5.2.6) liefert mir das auch wie erwartet folgende Ausgabe:

Das wundert mich ehrlich gesagt, da die korrekte Locale für Linux-Systeme „de_DE.UTF-8“ wäre.

OSX kenne ich nicht wirklich, aber kann es eventuell sein, dass du die Schreibweisen genau vertauscht hast?

netspy 18.05.2009 21:58

Nein, dass mit der Locale passt schon. locale -a liefert mir unter Linux …
Code:

de_DE@euro
de_DE.iso88591
de_DE.iso885915@euro
de_DE.utf8

… und unter Mac OS X (also Darwin/BSD) …
Code:

de_DE
de_DE.ISO8859-1
de_DE.ISO8859-15
de_DE.UTF-8

de_DE.UTF-8 nimmt Linux entsprechend gar nicht an, genau wie unter Mac de_DE.UTF8 nicht geht.

Die Locale stimmt also und wird richtig gesetzt. Nur interessiert das strcoll unter Mac irgendwie nicht. :(

Mario

inta 18.05.2009 23:31

Ein „locale | grep LC_COLLATE“ liefert mir hier:
Zitat:

LC_COLLATE="de_DE.UTF-8"
Die Ausgabe von „locale -a“ weicht hier komischer Weise ab, in sämtlichen Konfigurationsdateien findet sich die oben genannte Schreibweise.

Tut mir leid, eine andere Idee habe ich dazu auch nicht mehr. :|

netspy 19.05.2009 00:01

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

uspri 19.05.2009 08:46

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.

netspy 19.05.2009 10:51

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