Benutzer mit den meisten Antworten
Autocomplete mit deutschen Umlauten funktioniert nicht

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
- Bearbeitet Gernot Pfeifer Dienstag, 31. Juli 2012 19:58
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...
- Bearbeitet Elmar BoyeEditor Mittwoch, 1. August 2012 21:05
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 7. August 2012 07:13
-
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 ApplicationsGruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 7. August 2012 07:13
Alle Antworten
-
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öskusIn meiner Applikation (um die es eigentlich geht) sieht das Ergbnis in der Autflistung allerdings so aus:
Förster
Forster
Fösges
FöskusVielleicht 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
-
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...
- Bearbeitet Elmar BoyeEditor Mittwoch, 1. August 2012 21:05
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 7. August 2012 07:13
-
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!
GernotBTW:
Die in Deinem Posting genannten SQL-Statements führen übrigens zu den erwarteten Ergebnissen...
- Bearbeitet Gernot Pfeifer Donnerstag, 2. August 2012 21:24
-
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 ApplicationsGruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 7. August 2012 07:13
-
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,
RobertRobert Breitenhofer, MICROSOFT
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. -
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öskusEs ist zum verrückt werden,.... vielleicht hätte ich doch Metzgereifachverkäufer werden sollen...
Vielen Dank für Deine Unterstützung!
Gernot