none
Autocomplete mit deutschen Umlauten funktioniert nicht RRS feed

  • Frage

  • Hallo zusammen,

    ich bin hier auf ein seltsames Problem gestoßen und auch Google konnte mir nicht weiterhelfen.

    Ausgangssituation:

    Textbox mit Autocompletefunktion (AutoCompleteCustomSource; Modus: suggest)
    Alles funktioniert auch einwandfrei, bis auf folgendes Phänomen:

    Ich "adde" folgende Namen zur CustomSource:

    [...Haufen von Namen...]
    Förster
    Forster
    Fösges
    Föskus
    [...Haufen von Namen...]

    Wenn ich nun ein "f" eintippe, kommen alle Nachnamen mit dem Anfangsbuchstaben "f" in der Liste.
    Wenn ich nun ein "fö" eintippe, kommt nur(!) noch "Förster".
    Wenn ich nun ein "fös" eintippe, kommt nur(!) noch "Fösges".

    Das Problem ist bei den unterschiedlichsten Textboxen nachzuvollziehen (Neu erstellt, neue Textapplikation etc).

    Das Problem liegt scheinbar bei dem Namen "Forster" (insbesondere, dass dieser "zwischen" den Umlauten liegt).

    Füge ich den Forster nicht zu der Auflistung hinzu, verhält sich das Autocomplete wie erwartet.

    Ich bedanke mich für jede Unterstützung.

    Gernot


    Dienstag, 31. Juli 2012 19:57

Antworten

  • Hallo Gernot,

    da die Autocomplete Funktion vom Betriebssystem bereitgestellt wird,
    gelten die dortigen Sortiereinstellungen (Systemsteuerung->Region und Sprache => Sortierung)

    Und so liefert z. B. Deutschland - Wörterbuch eine andere als Deutschland - Telefonbuch:

            Dim values = New String() _
                                { _
                                    "Förster", _
                                    "Forster", _
                                    "Fösges", _
                                    "Föskus" _
                                }
    
            Dim germanComparer = StringComparer.Create(CultureInfo.GetCultureInfo(&H407), False)
            Dim phonebookComparer = StringComparer.Create(CultureInfo.GetCultureInfo(&H10407), False)
    
            Array.Sort(values, germanComparer)
            ' Forster;Förster;Fösges;Föskus
            Console.WriteLine(String.Join(";", values))
    
            Array.Sort(values, phonebookComparer)
            ' Förster;Fösges;Föskus;Forster
            Console.WriteLine(String.Join(";", values))

    Ergebnis unter Windows 7, ältere Versionen könnten wiederum abweichen - zur Länderkennung siehe LCID Structure

    Wobei Dein Applikationsergebnis so aussieht als ob Umlaute (Akzente) ignoriert werden (o == ö),
    weil schneller zu machen, hatte ich das via SQL Server getestet[1]:

    DECLARE @daten TABLE ( wort nvarchar(40) );
    INSERT INTO @daten VALUES (N'Förster'), (N'Fösges'), (N'Forster'), (N'Föskus');
    
    SELECT wort FROM @daten ORDER BY wort COLLATE Latin1_General_CI_AS;
    SELECT wort FROM @daten ORDER BY wort COLLATE German_PhoneBook_CI_AS;
    SELECT wort FROM @daten ORDER BY wort COLLATE Latin1_General_CI_AI;
    

    wobei CI_AI Akzente (Umlaute) beim Vergleich ignoriert, CS_AS sie berücksichtigt.

    Gruß Elmar

    [1] ich mir sonst erst einen passenden Comparer hätte basteln müssen...

    Mittwoch, 1. August 2012 20:56
    Beantworter
  • Hallo Gernot,

    die Autocomplete Funktionen sortieren selbst, das hatte ich ebenfalls getestet (nur nicht erwähnt).
    Zudem gilt: Ohne ORDER BY ist in SQL die Ausgabe zufällig / implementationsabhängig.

    Es scheint so zu sein, als ob Du abweichende Zeichentabellen hast, wenn bei Latin_General_CI_AS
    eine abweichende Sortierung herauskommt.
    Wobei es mir ein Rätsel ist, wie das zustande kommt - ich konnte dazu bisher nichts direkt finden.

    Schau Dir mal in die Windows Dokumentation zu NLS an - den Windows wie SQL Server verwenden -,
    hier u. a. Handling Sorting in Your Applications

    Gruß Elmar

    Freitag, 3. August 2012 06:43
    Beantworter

Alle Antworten

  • Ich kann dein Problem bei mir nicht nachvollziehen.

    Gebe ich "f" ein erscheine Förster,Forster,Fösgen,Föskus.

    Bei "fö" Förster,Fösgen,Föskus

    Bei "fös" Fösgen,Föskus.

    So wie es sein soll.

    Mittwoch, 1. August 2012 11:41
  • Hallo Jango,

    vielleicht ist es ja auch nur ein Sortierproblem.

    Ich habe mal folgendes getestet:

    Me.TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
            Me.TextBox1.AutoCompleteMode = AutoCompleteMode.Suggest
    
            Dim MySource As New AutoCompleteStringCollection()
            MySource.AddRange(New String() _
                                { _
                                    "Förster", _
                                    "Forster", _
                                    "Fösges", _
                                    "Föskus" _
                                })
    
            Me.TextBox1.AutoCompleteCustomSource = MySource

    Führt in diesem Bespiel zu dem Ergebnis:

    Forster
    Förster
    Fösges
    Föskus

    In meiner Applikation (um die es eigentlich geht) sieht das Ergbnis in der Autflistung allerdings so aus:

    Förster
    Forster
    Fösges
    Föskus

    Vielleicht wäre mein Problem schon gelöst, wenn ich die Sortierung richtig hinbekommen würde. Die Frage ist nur, warum wird in meiner Applikation offensichtlich ander sortiert; gibt es dann eine Einstellmöglichkeit für Autocomplete? In meiner "realen" Applikation habe ich die Liste wie oben im Quellcode gefüllt und komme dennoch offensichtlich zu einer anderen Sortierung, die dann vermutlich letztendlich zur falschen Anzeige führt.

    Viele Dank!

    Gernot

     

    Mittwoch, 1. August 2012 19:55
  • Hallo Gernot,

    da die Autocomplete Funktion vom Betriebssystem bereitgestellt wird,
    gelten die dortigen Sortiereinstellungen (Systemsteuerung->Region und Sprache => Sortierung)

    Und so liefert z. B. Deutschland - Wörterbuch eine andere als Deutschland - Telefonbuch:

            Dim values = New String() _
                                { _
                                    "Förster", _
                                    "Forster", _
                                    "Fösges", _
                                    "Föskus" _
                                }
    
            Dim germanComparer = StringComparer.Create(CultureInfo.GetCultureInfo(&H407), False)
            Dim phonebookComparer = StringComparer.Create(CultureInfo.GetCultureInfo(&H10407), False)
    
            Array.Sort(values, germanComparer)
            ' Forster;Förster;Fösges;Föskus
            Console.WriteLine(String.Join(";", values))
    
            Array.Sort(values, phonebookComparer)
            ' Förster;Fösges;Föskus;Forster
            Console.WriteLine(String.Join(";", values))

    Ergebnis unter Windows 7, ältere Versionen könnten wiederum abweichen - zur Länderkennung siehe LCID Structure

    Wobei Dein Applikationsergebnis so aussieht als ob Umlaute (Akzente) ignoriert werden (o == ö),
    weil schneller zu machen, hatte ich das via SQL Server getestet[1]:

    DECLARE @daten TABLE ( wort nvarchar(40) );
    INSERT INTO @daten VALUES (N'Förster'), (N'Fösges'), (N'Forster'), (N'Föskus');
    
    SELECT wort FROM @daten ORDER BY wort COLLATE Latin1_General_CI_AS;
    SELECT wort FROM @daten ORDER BY wort COLLATE German_PhoneBook_CI_AS;
    SELECT wort FROM @daten ORDER BY wort COLLATE Latin1_General_CI_AI;
    

    wobei CI_AI Akzente (Umlaute) beim Vergleich ignoriert, CS_AS sie berücksichtigt.

    Gruß Elmar

    [1] ich mir sonst erst einen passenden Comparer hätte basteln müssen...

    Mittwoch, 1. August 2012 20:56
    Beantworter
  • Hallo Elmar,

    erstmal vielen Dank für Deine wirklich ausführliche Hilfe.

    Dank Deinen Ideen habe ich hier mal ein bisschen getestet und es scheint wohl tatsächlich an der Sortierung zu liegen.

    Ich habe jetzt hier mal ein bisschen "gebaut und gebastelt" und konnte wohl mein Prolbem etwas eingrenzen,... wenn ich auch noch keine Lösung habe.

    Folgendes habe ich gebaut:

    - SQL-Servinstanz erstellt
    - Testdatenbank erstellt
    - Tabelle erstellt mit den im ersten Posting genannten Namen (=Datensätzen)
    - Sortierung geprüft: Latin1_General_CI_AS
    - Select-Statement gegen die Tabelle mit "order by Kundenname"
    - Ergebnis: Forster;Förster;Fösges;Föskus (also wie gewünscht)

    Dann:
    - obige Testdatenbank gelöscht
    - Backup der Produktivdatenbank in meine Testinstanz eingespielt
    - Sortierung geprüft: Latin1_General_CI_AS
    - Select-Statement gegen die Tabelle mit "order by Kundenname"
    - Ergebnis: Förster;Forster;Fösges;Föskus (also nicht wie gewünscht)
    - Select-Statement gegen die Tabelle mit "order by Kundenname collate Latin1_General_CI_AS"
    - Ergebnis: Förster;Forster;Fösges;Föskus (also nicht wie gewünscht)

    Nebenbei:
    Ich habe gerade festgestellt, dass ich in meinem Sourcode beim Einlesen der Tabelle kein "order by" verwendet habe;
    dennoch sortiert das autocomplete offensichtlich (wenn auch falsch).

    Tja.....??

    Vielen Dank!
    Gernot

    BTW:
    Die in Deinem Posting genannten SQL-Statements führen übrigens zu den erwarteten Ergebnissen...

    Donnerstag, 2. August 2012 21:23
  • Hallo Gernot,

    die Autocomplete Funktionen sortieren selbst, das hatte ich ebenfalls getestet (nur nicht erwähnt).
    Zudem gilt: Ohne ORDER BY ist in SQL die Ausgabe zufällig / implementationsabhängig.

    Es scheint so zu sein, als ob Du abweichende Zeichentabellen hast, wenn bei Latin_General_CI_AS
    eine abweichende Sortierung herauskommt.
    Wobei es mir ein Rätsel ist, wie das zustande kommt - ich konnte dazu bisher nichts direkt finden.

    Schau Dir mal in die Windows Dokumentation zu NLS an - den Windows wie SQL Server verwenden -,
    hier u. a. Handling Sorting in Your Applications

    Gruß Elmar

    Freitag, 3. August 2012 06:43
    Beantworter
  • Hallo Gernot Pfeifer,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 7. August 2012 07:13
    Moderator
  • Hallo Elmar,

    vielen Dank für Deine Unterstützung,... ich werde auf dem von Dir vorgeschlagenen Weg weitersuchen...

    Nochmals Danke!

    Gernot

    Dienstag, 7. August 2012 07:35
  • Hallo Robert,

    ja die Antworten haben mir weitergeholfen...

    Danke für die Markierung.

    Gernot

    Dienstag, 7. August 2012 07:37
  • Hallo Elmar,

    ich muss doch leider nochmal auf das Thema zurückkommen.

    Ich habe heute den ganzen Tag getestet, gegoogelt und natürlich auch Deinen Link nachverfolgt; leider ohne (positives) Ergebnis.

    Bei meinen Tests habe ich bei 3(!) unterschiedlichen SQL-Express-Servern (2 Instanzen von mir eingerichtet, 1 Instanz von einer "unbeteiligten" Person eingerichtet) immer das identische Ergebnis:

    - Ich habe jeweils eine neue Datenbank erstellt.
    - Tabelle hinzugefügt
    - Feld ID (=Identifikationsspalte) hinzugefügt
    - Feld Nachname hinzugefügt
    - Darauf geachtet, dass in der jeweiligen Datenbank als Sortierung Latin1_General_CI_AS eingestellt ist
    - Geprüft, ob im Feld Nachname als Sortierung "Datenbankstandard" eingestellt ist.
    - In die Tabelle die (zwischenzeitlich bekannten) Nachnamen eingefügt.

    Folgendes SQL-Statement bringt dann bei allen 3 Servern das unten genannte (falsche) Ergebnis

    SELECT Nachname from Testtabelle order by Nachname collate Latin1_General_CI_AS;

    - Fobes
    - Forster
    - Förster
    - Fösges
    - Foshag
    - Föskus

    Es ist zum verrückt werden,.... vielleicht hätte ich doch Metzgereifachverkäufer werden sollen...

    Vielen Dank für Deine Unterstützung!

    Gernot

    Dienstag, 7. August 2012 20:06