Werner: Sortierung zufällig?

Hallo,
zufällig habe ich entdeckt, dass die Ergebnisse der Sortierung eines arrays
im gleichen Programm auf unterschiedlichen Rechnern verschieden war. Und keine der beiden Ergebnisse hat übereingestimmt mit einer entsprechenden Sortierung in Word.
Jetzt habe ich gefunden, dass dies wohl mit der Einstellung LC_COLLATE zu tun hat.
Leider habe ich hierüber keine übersichtliche Beschreibung gefunden.
Welche Angabe ist denn sinnvoll wenn deutsche und französische Texte sortiert werden sollen?

  1. Hallo,
    zufällig habe ich entdeckt, dass die Ergebnisse der Sortierung eines arrays
    im gleichen Programm auf unterschiedlichen Rechnern verschieden war. Und keine der beiden Ergebnisse hat übereingestimmt mit einer entsprechenden Sortierung in Word.
    Jetzt habe ich gefunden, dass dies wohl mit der Einstellung LC_COLLATE zu tun hat.
    Leider habe ich hierüber keine übersichtliche Beschreibung gefunden.
    Welche Angabe ist denn sinnvoll wenn deutsche und französische Texte sortiert werden sollen?

    Ergänzung: Ich verwende strcoll

    1. Tach!

      [Unterschiedliche Sortierungen]
      Jetzt habe ich gefunden, dass dies wohl mit der Einstellung LC_COLLATE zu tun hat.

      Ich finde sowas üblicherweise nicht heraus, sondern lese es gezielt im Handbuch nach.

      Ergänzung: Ich verwende strcoll

      Da steht dann, leider aber nicht sehr deutlich, dass die "current locale" verwendet wird. Nur in der See-also-Auflistung wird unter anderem auf setlocale() verwiesen. Und dort steht dann, dass LC_COLLATE für strcoll() zuständig ist.

      Leider habe ich hierüber keine übersichtliche Beschreibung gefunden.

      Locale ist nun kein PHP-Thema, PHP nutzt es nur. Und nun kommt es darauf an, was auf dem System installiert ist.

      Welche Angabe ist denn sinnvoll wenn deutsche und französische Texte sortiert werden sollen?

      Natürlich nur eine, die auf dem System installiert ist. Wie man das herausfindet, findest du auf der Handbuchseite zu setlocale() - etwas versteckt beim Parameter locale. Was diese dann konkret bewirken wird irgendwo im Unix-Umfeld beschrieben sein oder in der MSDN für Windows.

      dedlfix.

      1. Hallo dedlfix,

        Natürlich nur eine, die auf dem System installiert ist. Wie man das herausfindet, findest du auf der Handbuchseite zu setlocale() - etwas versteckt beim Parameter locale. Was diese dann konkret bewirken wird irgendwo im Unix-Umfeld beschrieben sein oder in der MSDN für Windows.

        Ist es wirklich nötig, dass jeder Anwender einer Sortierung in php an versteckten Stllen in verschiedenen Handbüchern suchen muss, welche Einstellungen für eine landesspezifische Sortierung notwendig sind?
        Ich bin geschockt!

        1. Hallo,

          Ist es wirklich nötig, dass jeder Anwender einer Sortierung in php an versteckten Stllen in verschiedenen Handbüchern suchen muss, welche Einstellungen für eine landesspezifische Sortierung notwendig sind?

          nein, aber wenn er schon besondere Features verwendet, die das Betriebssystem zur Verfügung stellt (und die PHP nur abbildet), dann sollte er sich entweder genauer damit befassen, oder die Defaults einfach hinnehmen.

          Oder die Callback-Funktion für den Stringvergleich selbst schreiben.

          Abgesehen davon: Das Manual bietet in der Beschreibung zu strcoll() sowohl den Hinweis auf setlocale(), als auch ein Beispiel, das sehr deutlich zeigt, wie sich abhängig vom locale unterschiedliche Sortierungen ergeben.

          Ciao,
           Martin

          --
          Elefant zum Kamel: "Sag mal, wieso hast du denn den Busen auf dem Rücken?"
          Kamel:             "Ziemlich freche Frage für einen, der den Penis im Gesicht hat."
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Hallo,

            Abgesehen davon: Das Manual bietet in der Beschreibung zu strcoll() sowohl den Hinweis auf setlocale(), als auch ein Beispiel, das sehr deutlich zeigt, wie sich abhängig vom locale unterschiedliche Sortierungen ergeben.

            Schön wärs!
            Habe das Beispiel

            <?php  
              
             $a = 'a';  
             $b = 'A';  
              
             print strcmp ($a, $b) . "\n"; // prints 1  
              
            setlocale (LC_COLLATE, 'C');  
             print "C: " . strcoll ($a, $b) . "\n"; // prints 1  
              
             setlocale (LC_COLLATE, 'de_DE');  
             print "de_DE: " . strcoll ($a, $b) . "\n"; // prints -2  
              
             setlocale (LC_COLLATE, 'de_CH');  
            print "de_CH: " . strcoll ($a, $b) . "\n"; // prints -2  
              
             setlocale (LC_COLLATE, 'en_US');  
             print "en_US: " . strcoll ($a, $b) . "\n"; // prints -2  
              
            ?>
            

            gesehen und ausprobiert, Ergebnis
            1 C: 1 de_DE: 1 de_CH: 1 en_US: 1

            1. Hi,

              ein Beispiel, das sehr deutlich zeigt, wie sich abhängig vom locale unterschiedliche Sortierungen ergeben.
              Schön wärs!
              Habe das Beispiel

              <?php

              $a = 'a';
              $b = 'A';
              [...]
              ?>

              
              > gesehen und ausprobiert, Ergebnis  
              > 1 C: 1 de\_DE: 1 de\_CH: 1 en\_US: 1  
                
              kann ich bestätigen. Das liegt dann wahrscheinlich daran, dass der Aufruf von setlocale() fehlschlägt. Hast du mal den Rückgabewert überprüft? Auf meinem Testsystem gelingt beispielsweise nur das Setzen von "C", was bei mir gleichzeitig der Standardwert für LC\_COLLATE ist. Sowohl de\_DE, als auch de\_CH, als auch en\_US schlägt bei mir fehl, erkennbar daran, dass setlocale() FALSE liefert. Okay, bei de\_DE und de\_CH ist das kein Wunder, denn die sind auf meinem System gar nicht vorhanden, en\_US aber sehr wohl. Das hätte eigentlich gehen müssen. Hmm ...  
                
              So long,  
               Martin  
              
              -- 
              Das Leben ist lebensgefährlich und endet meistens tödlich.  
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              
              1. Hallo,

                einen hab ich noch. :-)

                [...] de_DE und de_CH ist das kein Wunder, denn die sind auf meinem System gar nicht vorhanden, en_US aber sehr wohl. Das hätte eigentlich gehen müssen. Hmm ...

                Eben festgestellt: Wenn ich die locale-Definition vollständig angebe (also "en_US.UTF-8"), dann geht der Aufruf von setlocale() in Ordnung, und dann bekommt strcoll() auch ein abweichendes Ergebnis raus, nämlich -7. Okay, der Zahlenwert -7 ist für mich nicht nachvollziehbar, aber entscheidend ist ja nur, ob größer, kleiner, oder gleich Null. Das Vorzeichen hat sich zumindest gegenüber der locale "C" umgekehrt, die beiden Strings "a" und "A" werden folglich genau andersrum sortiert.

                Ciao,
                 Martin

                --
                F: Was sagt die kleine Kerze zur großen Kerze?
                A: Ich gehe heute nacht aus!
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. [...] de_DE und de_CH ist das kein Wunder, denn die sind auf meinem System gar nicht vorhanden, en_US aber sehr wohl. Das hätte eigentlich gehen müssen. Hmm ...

                  Eben festgestellt: Wenn ich die locale-Definition vollständig angebe (also "en_US.UTF-8"), dann geht der Aufruf von setlocale() in Ordnung, und dann bekommt strcoll() auch ein abweichendes Ergebnis raus, nämlich -7. Okay, der Zahlenwert -7 ist für mich nicht nachvollziehbar, aber entscheidend ist ja nur, ob größer, kleiner, oder gleich Null. Das Vorzeichen hat sich zumindest gegenüber der locale "C" umgekehrt, die beiden Strings "a" und "A" werden folglich genau andersrum sortiert.

                  Diese Nachforschungen und Erkenntnisse sind natürlich nur einem erfahrenen EDVler möglich und es bestätigt meinen Eindruck, dass hier ein gewisses Chaos herrscht - daher auch nirgendwo eine klare Beschreibung für "Greenhorns" zu finden.
                  Ich habe bei Word noch nie Unterschiede in der Sortierung festgestellt, wenn ich auf unterschiedlichen Rechnern gearbeitet habe (aber vielleicht ist es mir nur nicht aufgefallen?)

                  1. Hallo Werner,

                    Diese Nachforschungen und Erkenntnisse sind natürlich nur einem erfahrenen EDVler möglich und es bestätigt meinen Eindruck, dass hier ein gewisses Chaos herrscht

                    naja, "Chaos" ist vielleicht ein harter Ausdruck dafür, aber ich gebe zu, dass der Themenkomplex recht komplex ist. ;-)
                    Dazu kommt, dass die unixoiden Systeme so furchtbar flexibel sein wollen, und daher locale-Einstellungen nicht nur systemweit, sondern auch wieder pro User zulassen, und darüber hinaus kann man auch gezielt aus einem Programm heraus die locales verändern, die für eben dieses Programm gelten. Kein Wunder, dass da nicht immer alles so funktioniert, wie man es haben möchte.
                    Ich hätte zum Beispiel auf meinem System gern die Sortierung nach dem C-locale, gleichzeitig aber die Datumsanzeige im ISO-Format (YYYY-MM-DD), wie sie z.B. im en_DK-locale definiert ist. Aber beides gleichzeitig kriege ich nicht hin.

                    Ich habe bei Word noch nie Unterschiede in der Sortierung festgestellt, wenn ich auf unterschiedlichen Rechnern gearbeitet habe (aber vielleicht ist es mir nur nicht aufgefallen?)

                    Windows kennt das Konzept der locales in dieser Form nicht; hier werden diese Einstellungen in den "Regions- und Spracheinstellungen" über die Systemsteuerung zentral verwaltet. Eine getrennte Einstellung pro User oder gar pro Prozess ist unter Windows AFAIK nicht möglich. Das macht die Sache zwar weniger flexibel, aber für den Nutzer einfacher.

                    Wahrscheinlich ist dir der Unterschied deshalb nicht aufgefallen, weil die PCs alle die gleiche, für Deutschland typische Sortierung verwenden. Aber vergleiche mal die Sortierreihenfolge auf einem PC, der auf "Deutsch" getrimmt ist, mit einem, der konsequent auf Französisch läuft. Da _ist_ ein Unterschied, mindestens bei Umlauten, dem 'ß' und Akzent-Zeichen.

                    Ciao,
                     Martin

                    --
                    Um die Wahrheit zu erfahren, muss man den Menschen widersprechen.
                      (George Bernhard Shaw)
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                    1. Tach!

                      Ich hätte zum Beispiel auf meinem System gern die Sortierung nach dem C-locale, gleichzeitig aber die Datumsanzeige im ISO-Format (YYYY-MM-DD), wie sie z.B. im en_DK-locale definiert ist. Aber beides gleichzeitig kriege ich nicht hin.

                      Warum nicht? Es gibt ja schließlich nicht nur LC_ALL.

                      Windows kennt das Konzept der locales in dieser Form nicht;

                      Aber in anderer Form.

                      hier werden diese Einstellungen in den "Regions- und Spracheinstellungen" über die Systemsteuerung zentral verwaltet. Eine getrennte Einstellung pro User oder gar pro Prozess ist unter Windows AFAIK nicht möglich.

                      Doch, es ist je User unterschiedlich einstellbar. Vielleicht nur nicht mit jeder Windows-Variante und -Version. Zudem kann man beim Programmieren mit dem .NET-Framework sehr wohl auch noch individuelle Einstellungen für das gesamte Programm vornehmen oder gar für jede Funktion, die davon betroffen ist, selbst auswählen, welche CultureInfo man verwenden möchte. Und das wird sicher nicht auf .NET beschränkt sein.

                      dedlfix.

                      1. Hallo,

                        Ich hätte zum Beispiel auf meinem System gern die Sortierung nach dem C-locale, gleichzeitig aber die Datumsanzeige im ISO-Format (YYYY-MM-DD), wie sie z.B. im en_DK-locale definiert ist. Aber beides gleichzeitig kriege ich nicht hin.
                        Warum nicht?

                        tja, das habe ich mich auch schon gefragt. Möglicherweise ein Problem mit Linux Mint 12? Denn auf einem anderen System mit Mint 13 geht's auch in Kombination.

                        Es gibt ja schließlich nicht nur LC_ALL.

                        Eben. Deswegen habe ich en_US.UTF-8 als Basis-locale, und in /etc/default/locale stehen folgende zwei Zeilen:

                        LC_TIME="en_DK.UTF-8"
                          LC_COLLATE=C

                        Auf dem Mint-12-System zeigt in dieser Konstellation die Zeile mit LC_COLLATE keine Wirkung, was ich sowohl an der Ausgabe von 'locale', als auch an der Datei-Reihenfolge von 'ls' oder auch im GUI-Dateimanager feststelle. Die Reihenfolge der beiden Anweisungen spielt auch keine Rolle.
                        Nehme ich die Zeile mit LC_TIME heraus, dann habe ich plötzlich die gewünschte C-Sortierreihenfolge, aber wieder das US-Datums/Zeitformat. Ich versteh's nicht ...

                        hier werden diese Einstellungen in den "Regions- und Spracheinstellungen" über die Systemsteuerung zentral verwaltet. Eine getrennte Einstellung pro User oder gar pro Prozess ist unter Windows AFAIK nicht möglich.
                        Doch, es ist je User unterschiedlich einstellbar. Vielleicht nur nicht mit jeder Windows-Variante und -Version.

                        Ah, das wusste ich nicht. Ich weiß, dass manche Einstellungen unter Windows benutzerspezifisch sind, aber gerade bei den Regions- und Sprachoptionen hatte ich immer den Eindruck, sie wären benutzerübergreifend. Wären sie es nicht, dann wäre es ja auch sinnlos, dass ein Administrator den Zugriff auf diese Einstellungen verbieten kann.

                        Zudem kann man beim Programmieren mit dem .NET-Framework sehr wohl auch noch individuelle Einstellungen für das gesamte Programm vornehmen oder gar für jede Funktion, die davon betroffen ist, selbst auswählen, welche CultureInfo man verwenden möchte. Und das wird sicher nicht auf .NET beschränkt sein.

                        Hm. Okay. Das war mir bisher nicht bekannt.

                        Ciao,
                         Martin

                        --
                        Ich habe gerade erfahren, dass Tante Frieda gestorben ist. Der Tod hat sie im Schlaf ereilt. - Schrecklich. Dann weiß sie es also noch gar nicht?
                        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      2. Tach!

        Natürlich nur eine, die auf dem System installiert ist. Wie man das herausfindet, findest du auf der Handbuchseite zu setlocale() - etwas versteckt beim Parameter locale.

        Da hatte ich falsch gelesen. Die Liste bekommt man anscheinend nicht direkt in PHP geliefert, nur den aktuell gesetzten Wert. Die Liste selbst bekommt man über locale -a, was man über Shellfunktionen aufrufen kann.

        dedlfix.

        1. Hallo dedlfix
           und Mitleser,

          Da hatte ich falsch gelesen. Die Liste bekommt man anscheinend nicht direkt in PHP geliefert, nur den aktuell gesetzten Wert. Die Liste selbst bekommt man über locale -a, was man über Shellfunktionen aufrufen kann.

          Was entspricht in Windows der zitierten "Shellfunktionen" (das Dos-Fenster ist es offensichtlich nicht)?
          Danke
          Werner

          1. Hallo,

            [...] was man über Shellfunktionen aufrufen kann.
            Was entspricht in Windows der zitierten "Shellfunktionen" (das Dos-Fenster ist es offensichtlich nicht)?

            im Wesentlichen ist es die exec()-Funktion. Hilft dir aber nicht weiter, weil es -wie ich an anderer Stelle erklärt habe- unter Windows keine locales im Unix-Sinn gibt. Da legst du alle sprach- und länderspezifischen Optionen in der Systemsteuerung zentral fest.

            Ciao,
             Martin

            --
            Fische, die bellen, beißen nicht.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Welche Angabe ist denn sinnvoll wenn deutsche und französische Texte sortiert werden sollen?

    Hast du dir angeschaut was dazu zu finden ist?
    Ich nehme an da geht es um Sortierung von Buchstaben mit Akzent? Da kommt es auf das von dir gewünschte Ergebnis an, sinnvoll ist also das was du nach dem Lesen als sinnvoll erachtest ;-)