2009-11-25 5 views
5

Ich versuche, verschiedene Strategien für die Groß-und Kleinschreibung UTF-8 String-Vergleich zu bewerten.Fall falten UTF-8 ohne die Sprache zu kennen

Ich habe etwas vom Unicode-Konsortium gelesen, experimentierte mit ICU und versuchte, verschiedene Implementierungsalternativen zu finden.

Bei mehreren Gelegenheiten habe ich gesehen, dass Texte zwischen Simple Case Mapping und Full Case Mapping unterscheiden, und ich wollte sicherstellen, dass ich den Unterschied vollständig verstehe.

Wie ich es gelesen habe, ist Simple Case Mapping "kontextfrei", d. H. Muss nicht wissen, welche Sprache die Nutzlast ist. Dies wird aufgrund des turkischen "I/ı/İ/i" -Debakels zu ungefähren Ergebnissen führen.

Vollständige Case Mapping, auf der anderen Seite, muss die Sprache der Nutzlast kennen, um das Mapping durchführen zu können. Mit dieser zusätzlichen Information kann es spezielle Maßnahmen ergreifen, um Fälle abzudecken, in denen "Kim" als eine Turkic-Saite "KIM" in Großbuchstaben wird, aber "Kim" als eine englische Saite, sollte "KIM" in Großbuchstaben werden.

Habe ich das richtig verstanden?

Gibt es weitere Beispiele für "facettenreiche" Codepunkte, die sich für verschiedene Sprachen unterscheiden?

Danke!

UPDATE: Eine der Quellen, die einfache Fallzuordnung als sprachunabhängig nennt, ist ICU's documentation. Ich habe das als Unicode-Wahrheit interpretiert, aber vielleicht ist es nur eine Aussage über die Implementierung?

Antwort

2

Nein, ein "Full Case Mapping" ist ein Gehäuse, bei dem ein Codepunkt durch mehr als einen neuen Codepoint ersetzt werden muss. Eine einfache Fallzuordnung ist eine einzelne Codepunktsubstitution.

Wenn Sie dies selbst implementieren möchten, ist die Unicode CaseFolding.txt Datei entscheidend, um dies richtig zu machen. Beachten Sie den Statusfeldcode "T", speziell dort, um das Turkish-I-Problem zu behandeln.

+0

Also brauchen beide den Sprachkontext, oder? Ich benutze eine Drittanbieter-Bibliothek (PCRE), die nicht CaseFolding.txt, sondern nur die Fallinformation aus UnicodeData.txt verwendet und keinen Sprachkontext benötigt (weder explizit noch implizit, soweit ich das beurteilen kann). Ich dachte mir, dass das im Simple-Fall vielleicht ein wirklicher Kompromiss war. –

+0

Absolut. Wie in der Datei angegeben, müssen Sie wissen, wann die Datensätze mit dem Statuscode "T" ignoriert werden sollen. –

+0

Soweit ich sehen kann, erscheint der T-Statuscode in CaseFolding.txt und nicht UnicodeData.txt. Aber sagen Sie wirklich, dass _correct_ falten nur mit Kenntnis des Sprachkontextes gemacht werden kann? Ich suche einen Kompromiss, der nicht den Kontext erfordert und nicht 100% perfekt ist ... Aber vielleicht ist das der erste Schritt auf dem Weg zur Wärme? –

2

Nun ... Die Konsonantenkombination "SS" würde für die meisten westlichen Sprachen auf "ss" herunterfallen, aber auf Deutsch könnte es der Sonderbrief "ß" werden. Das ist nur "Macht", es sind durchaus usage rules zu beachten.

Ich glaube, das hat keinen direkten Einfluss auf die Kollatierungsreihenfolge (irgendwelche Deutschen sind natürlich willkommen, mich zu korrigieren), also vielleicht ist es ein strittiger Punkt.

+0

Danke! Habe ich den Unterschied zwischen einfacher und vollständiger Zuordnung richtig verstanden? –

+3

Obwohl der obere Teil "ß" dir "SS" gibt, habe ich keinen Rahmen gesehen, der das Gegenteil bewirkt (Kleinbuchstaben ("SS") ergibt "ß"). Dies ist, weil manchmal "ss" sein sollte und die einzige Möglichkeit zu entscheiden ist, ein vollständiges deutsches Wörterbuch zu haben. Und manchmal ist das nicht genug (zum Beispiel sind sowohl "weiss" als auch "weiß" richtige Worte). In der Tat kann nicht einmal ein Mensch "WEISS" ohne Kontext klein schreiben (was es bedeutet). –

+0

@Mihai - danke, das macht Sinn. Ich hatte den gleichen Gedanken, dass eine Überziehung viel einfacher wäre als eine Senkung. –

Verwandte Themen