2009-08-17 7 views
6

ermitteln Ich habe eine Zeichenfolge und ich möchte überprüfen, ob der Inhalt in Englisch oder Hindi (Meine lokale Sprache) ist. Ich fand heraus, dass der Unicode-Bereich für Hindi-Zeichen von U0900-U097F stammt.Locale aus Unicode-String in C++

Was ist der einfachste Weg zu finden, ob der String irgendwelche Zeichen in diesem Bereich hat?

Ich kann std :: string oder Glib :: ustring verwenden, je nachdem, was bequem ist.

+0

Was ist die Codierung, die Sie verwenden? – AraK

+0

Ich benutze UTF-8. – Pallavi

Antwort

2

Hier ist, wie Sie es mit Glib tun :: ustring:

using Glib::ustring; 

ustring x("सहस"); // hindi string 
bool is_hindi = false; 
for (ustring::iterator i = x.begin(); i != x.end(); i ++) 
    if (*i >= 0x0900 && *i <= 0x097f) 
     is_hindi = true; 
+0

Das Bit "सहस" ist weder in der Theorie noch in der Praxis tragbar. Es funktioniert, wenn Sie eine Char-Codierung haben, die Hindi unterstützt. Da Hindi nur U0900-U097F ist, können Sie das an ASCII anhängen und es immer noch in 8 Bits einbauen, also nehme ich an, dass solche Kodierungen existieren. – MSalters

1

Der erste Schritt ist das Schreiben eines Funktors, um festzustellen, ob ein gegebenes wchar_t Hindi ist. Dies wird (abgeleitet von) std::unary_function<wchar_t, bool> sein. Die Implementierung ist trivial: return c>= 0x0900 && c < 0x980;. Der zweite Schritt ist es zu verwenden: std::find_if(begin, end, is_hindi()).

Da Sie Unicode benötigen, sollten Sie wahrscheinlich wchar_t und daher std::wstring verwenden. Weder std::string noch GLib::ustring unterstützt Unicode. Auf einigen Systemen (insbesondere Windows) ist die Implementierung von wchar_t auf Unicode 4 = 16 Bit beschränkt, aber das sollte immer noch für 99,9% der Weltbevölkerung ausreichen.

Sie müssen von/in UTF-8 auf I/O konvertieren, aber der Vorteil von "ein Zeichen = ein wchar_t" ist groß. Zum Beispiel wird std::wstring::substr() vernünftig funktionieren. Sie könnten jedoch immer noch Probleme mit "Zeichen" wie U + 094B (DEVANAGARI VOWEL SIGN O) haben. Wenn Sie über ein std :: wstring-Objekt iterieren, erscheint dieses anstelle eines Modifikators als eigenständiges Zeichen. Das ist immer noch besser als std :: string mit UTF-8, wo Sie am Ende über die einzelnen Bytes von U + 094B iterieren würden. Und um nur Ihre ursprünglichen Beispiele zu nehmen, ist keines der Bytes in UTF8(U+094B) für Hindi reserviert.

+0

Danke für die Antwort. Wie sieht die Vergleichsaussage im Funktor aus? – Pallavi

+0

Warum sagen Sie, dass GLib :: ustring Unicode nicht korrekt unterstützt? –

+0

@ltcmelo, er schrieb nicht "richtig", schrieb er "richtig". Das bedeutet, dass man zum Beispiel std :: string verwenden kann, um Unicode zu unterstützen, aber std :: string selbst weiß nichts über Unicode. –

1

Wenn die Zeichenfolge bereits als UTF-8 codiert ist, würde ich sie nicht in UTF-16 umwandeln (ich nehme an, dass MSalters "Unicode richtig" nennt), sondern die UTF-8-codierte Zeichenfolge durchlaufen und prüfen, ob es da ist ein Hindi-Zeichen darin.

Mit std :: string können Sie einfach mit Hilfe der Bibliothek UTF8-CPP iterieren: - Werfen Sie einen Blick auf utf8 :: next() - Funktion oder die Iterator-Klasse.

GLib :: ustring hat eine iterator, die die gleiche Funktionalität zu aktivieren scheint (habe es nicht ausprobiert):