2009-08-17 8 views
6

J'ai une chaîne de caractères et je souhaite vérifier si le contenu est en anglais ou en hindi (ma langue locale). J'ai compris que la plage unicode pour le caractère hindi est de U0900-U097F.Détection des paramètres régionaux à partir d'une chaîne unicode en C++

Quel est le moyen le plus simple de trouver si la chaîne a des caractères dans cette gamme?

Je peux utiliser std :: string ou Glib :: ustring en fonction de ce qui est pratique.

+0

Qu'est-ce l'encodage que vous utilisez? – AraK

+0

J'utilise UTF-8. – Pallavi

Répondre

2

Voici comment vous le faites avec Glib :: 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

Le bit "सहस" n'est pas portable, ni en théorie ni en pratique. Cela fonctionne si vous avez un encodage 'char' qui supporte le hindi. Comme Hindi est juste U0900-U097F, vous pouvez l'ajouter à ASCII et l'insérer dans 8 bits, donc je suppose que de tels encodages existent. – MSalters

1

La première étape consiste à écrire un foncteur pour déterminer si un wchar_t donné est Hindi. Ce sera (dérivé de) un std::unary_function<wchar_t, bool>. La mise en œuvre est triviale: return c>= 0x0900 && c < 0x980;. La deuxième étape est l'utiliser: std::find_if(begin, end, is_hindi()).

Puisque vous aurez besoin d'Unicode, vous devriez probablement utiliser wchar_t et donc std::wstring. Ni std::string ni GLib::ustring ne prennent en charge Unicode correctement. Sur certains systèmes (Windows en particulier) l'implémentation de wchar_t est restreinte à Unicode 4 = 16 bits mais cela devrait être suffisant pour 99,9% de la population mondiale.

Vous aurez besoin de convertir de/vers UTF-8 sur E/S, mais l'avantage de "un caractère = un wchar_t" est grand. Par exemple, std::wstring::substr() fonctionnera raisonnablement. Vous pourriez toujours avoir des problèmes avec des "caractères" comme U + 094B (DEVANAGARI VOWEL SIGN O), cependant. Lorsque vous itérez sur un std :: wstring, cela apparaîtra comme un caractère par lui-même, au lieu d'un modificateur. C'est toujours mieux que std :: string avec UTF-8, où vous finiriez par itérer sur les octets individuels de U + 094B. Et pour ne prendre que vos exemples d'origine, aucun des octets de UTF8(U+094B) n'est réservé à Hindi.

+0

Merci pour la réponse. À quoi ressemblerait l'instruction de comparaison dans le foncteur? – Pallavi

+0

Pourquoi dites-vous que GLib :: ustring ne supporte pas Unicode correctement? –

+0

@ ltcmelo, il n'a pas écrit "correctement", il a écrit "propre". Cela signifie que l'on peut utiliser, par exemple, std :: string pour prendre en charge Unicode, mais std :: string lui-même ne sait rien sur Unicode. –

1

Si la chaîne est déjà encodée en UTF-8, je ne la convertirais pas en UTF-16 (je présume que MSalters appelle "Unicode correct"), mais parcourez la chaîne codée en UTF-8 et vérifiez s'il y a un caractère hindi en elle. Avec std :: string, vous pouvez facilement itérer avec l'aide de la bibliothèque UTF8-CPP: - jetez un oeil à la fonction utf8 :: next(), ou la classe itérateur.

GLib :: ustring a une iterator qui semble permettre à la même fonctionnalité (ont pas essayé):

Questions connexes