2016-04-12 6 views
0

Die Anforderung besteht darin, dass sowohl ASCII- als auch Unicode-Zeichenfolgen in Groß- und Kleinschreibung unterschieden werden können. Jede Eingabezeichenfolge wird unter Verwendung von UTF-16LE codiert und als ein std::basic_string<u_int16_t>-Datentyp gespeichert. Die Mehrzahl der Vorschläge wies auf die Intensivstation hin, also nahm ich einen Stich.Ermitteln der richtigen Collator-Einstellung in der ICU

Ich schrieb einen Beispielcode ein paar Probe-Eingänge ausprobieren:

#include <iostream.h> 
#include "unicode/coll.h" 

using namespace icu; 
using namespace std; 

int main() 
{ 
    UErrorCode success = U_ZERO_ERROR; 
    Collator *collator = Collator::createInstance("UTF-16LE", success); 
    collator->setStrength(Collator::PRIMARY); 

    if (collator->compare("dinç", "DINÇ") == 0) { 
     cout << "Strings are equal" << endl; 
    } else { 
     cout << "Strings are unequal" << endl; 
    } 
    return 0; 
} 

Die Saiten in Frage haben türkische Zeichen. Von dem was ich lese, sollte der Zeichenfolgenvergleich fehlschlagen, da sich 'i' und 'I' im Zeichensatz unterscheiden, unabhängig davon, ob sie beide Groß- oder Kleinbuchstaben sind. Aber sie werden als gleich angesehen.

Ein paar Fragen:

  1. Sollten die Strings UTF-16 codiert sie auf die Intensivstation zu füttern, bevor sein? Würde das das Problem lösen?

  2. Welche Sortierereinstellungen sind im Allgemeinen ideal für die Unterstützung von Groß- und Kleinschreibung bei UTF-16-codierten Zeichenfolgen? Ich habe gelesen, dass, wenn die Stärke auf PRIMARY und SECONDARY eingestellt ist, es zu einem Vergleich zwischen Groß- und Kleinschreibung kommt. Gibt es noch etwas anderes, das ich vermisse?

Vielen Dank!

Antwort

1

Zusätzlich gibt es noch etwas, das ich vermisse?

JA! In deinem Code fehlt das Türkisch.

Die Unicode-Casing-Regeln sind ein bisschen einfach, bis Sie Türkisch dort & Dolch bekommen. Turkish Is are messy. Die Großbuchstabenform von i ist İ, nicht I, und die Kleinbuchstabe I ist , nicht i; und das Paar i/İ bezeichnet einen anderen Buchstaben als das Paar /I.

Dies bedeutet, dass es zwei verschiedene Sätze von Regeln für den Vergleich zwischen Groß- und Kleinschreibung gibt: eine mit i ist gleich I (die meisten Gebietsschemas), und eine, wo es anders ist (für türkische und aserbaidschanische Gebietsschemas).

Um die türkische Gebietsschema-Semantik mit ICU zu erhalten, müssen Sie create a collator with a specific locale, in diesem Fall das tr_TR-Gebietsschema.


& dolch; nicht nur Türkisch. Es gibt vier Sprachen mit seltsamen Casing-Regeln; von unordentlich bis höllisch: Türkisch und Azeri, Litauisch, Griechisch.

+0

Danke! Würde ein Collator mit UTF-16 als Gebietsschema für die meisten anderen Sprachen in der Lage sein, die vier Sprachen zu ignorieren, die Sie erwähnten? – Maddy

+0

Auch dieser [post] (http://stackoverflow.com/questions/2241348/what-is-unicode-utf-8-utf-16) sagt, dass UTF-16 Größe variabel ist und bis zu 4 Bytes gehen kann. Wenn ja, muss der Speicher, der für die Strings benötigt wird, in 'std :: basic_string ' oder das Äquivalent geändert werden, richtig? – Maddy

+1

@Maddy es wäre in der Lage, Gleichheitsvergleiche zu tun, aber Reihenfolge (aka Collation) variiert viel von Sprache zu Sprache, also nein. Ändern Sie auch nicht Ihre Saiten. UTF-16 verwendet 16-Bit-Einheiten. –

Verwandte Themen