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, $i, 1, '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.
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