Ich muss prüfen, ob die bestimmte Zeichenfolge mit einer anderen Zeichenfolge beginnt. Zeichenfolgen werden mit utf8 codiert, und bei einem Vergleich sollte die Groß- / Kleinschreibung nicht beachtet werden.
Ich weiß, dass dies dem Thema sehr ähnlich ist Groß- und Kleinschreibung in String-Vergleich in C ++ < Ich möchte aber die Boost-Bibliothek nicht verwenden und bevorzuge portable Lösungen (Wenn es "fast" unmöglich ist, bevorzuge ich Linux-orientierte Lösungen).
Ist es in C ++ 11 möglich, seine regexp-Bibliothek zu verwenden? Oder einfach einfache String-Vergleichsmethoden verwenden?
Das einzige, was ich davon weiß, ist UTF8 / Internationalisierung / Kulturbewusstsein ist die ausgezeichnete und gepflegte IBM ICU: Internationale Komponenten für Unicode Es ist eine C / C ++ - Bibliothek für * nix oder Windows, in die eine Menge Forschung investiert hat, um eine Kultur-bewusste Zeichenketten-Bibliothek bereitzustellen, einschließlich eines Vergleiches von Groß- und Kleinschreibung, der sowohl schnell als auch genau ist.
IMHO, die zwei Dinge, die Sie niemals selbst schreiben sollten, wenn Sie nicht gerade eine Diplomarbeit machen, sind Verschlüsselung und kultursensitive String-Bibliotheken.
Gibt es Einschränkungen hinsichtlich der Zeichenfolge, die Sie suchen?
zum? Es ist Benutzereingaben und kann jede UTF-8-Zeichenfolge sein, das Problem ist
sehr komplex. Wie andere schon erwähnt haben, kann ein Charakter haben
mehrere verschiedene Darstellungen, also müssten Sie sich wahrscheinlich normalisieren
die Saiten zuerst. Dann: Was gilt als gleichwertig? Sollte 'E'
vergleichen
gleich 'é'
(wie in einigen Kreisen in Französisch üblich) oder nicht (was
würde den "offiziellen" Regeln der Imprimerie nationale entsprechen.
Für alle außer den trivialsten Definitionen, rollen Sie Ihren eigenen Willen einen erheblichen Aufwand darstellen. Für diese Art von Sache, die Bibliothek ICU ist die Referenz. Es enthält alles, was Sie brauchen. Beachten Sie jedoch das Es funktioniert auf UTF16, nicht UTF8, also müssen Sie die Strings konvertieren erstens, sowie sie zu normalisieren. (ICU hat Unterstützung für beide.)
Mit den stl regex-Klassen könntest du so etwas wie das folgende Snippet machen. Leider ist es nicht utf8. Das Ändern von str2
in std::wstring str2 = L"hello World"
führt zu vielen Konvertierungswarnungen. Making str1
an std::wchar
funktioniert überhaupt nicht, da std :: regex keine whar-Eingabe erlaubt (soweit ich sehen kann).