Recherche d'une bibliothèque de plate-forme et de 3ème bibliothèque - de manière indépendante d'itération de la chaîne UTF-8 ou de la séparant dans une matrice de symboles UTF-8. P>
Veuillez poster un extrait de code. P>
5 Réponses :
Essayez bibliothèque ICU . P>
"3rd-Party-bibliothèque - de manière indépendante"
+1 ICU est une bibliothèque multiplate-forme publiée sous une licence open source permissive. Si l'OP souhaite éviter la dépendance sur une bibliothèque 3ème partie, le code source de l'ICU est disponible librement mais contient plus de 1E + 06 lignes de code.
C'est une source ouverte. Vous pouvez essayer d'utiliser la source d'itérateur de chaînes à partir de celui-ci, pas toutes les lignes de code 1E + 06.
Si je comprends bien correctement, on dirait que vous souhaitez trouver le début de chaque caractère UTF-8. Si tel est le cas, il serait assez simple de les analyser (les interpréter est une question différente). Mais la définition du montant de combien d'octets est impliquée est bien définie par le RFC :
unsigned char lb; if (( lb & 0x80 ) == 0 ) // lead bit is zero, must be a single ascii printf( "1 octet\n" ); else if (( lb & 0xE0 ) == 0xC0 ) // 110x xxxx printf( "2 octets\n" ); else if (( lb & 0xF0 ) == 0xE0 ) // 1110 xxxx printf( "3 octets\n" ); else if (( lb & 0xF8 ) == 0xF0 ) // 1111 0xxx printf( "4 octets\n" ); else printf( "Unrecognized lead byte (%02x)\n", lb );
Belle réponse! Ceci est exactement ce que je cherchais! Merci!
éteint le brassard:
Merci. L'endianisme est-elle importante pour cette fonction?
"Si (* IT <0x80) {u.Push_back (* IT);}" => "La comparaison est toujours vraie en raison de la plage limitée de type de données"
Conversion non valide de const char * const 'à code> char *'
Ok, j'ai corrigé les bugs. UTF8 est strictement octet du niveau d'octet afin que l'endiangité ne peut pas importer.
Quoi? "L'endianness est la commande de sous-unités individuellement adressables (mots, octets, ou même bits)" ( FR. wikipedia.org/wiki/endianness ) codage multi-octets dépend de l'endianesse.
Je vais le répéter. UTF8 est un codage de niveau d'octet. Cela signifie que vous lisez chaque octet séquentiellement. Peu importe quel ordre les bits sont transmis entre les ports IP ou la mémoire principale aux registres du microprocesseur. Lorsque ces bits sont remis ensemble, ils sont interprétés de la même manière sur tous les processeurs (19 == 19). L'endansement n'est pas un problème.
UTF8 CPP est exactement ce que vous voulez p>
J'ai déjà trouvé cette bibliothèque par moi-même. J'avais besoin d'un code, mais merci quand même.
résolu à l'aide de minuscules plate-forme indépendant Bibliothèque UTF8 CPP :
char* str = (char*)text.c_str(); // utf-8 string char* str_i = str; // string iterator char* end = str+strlen(str)+1; // end iterator do { uint32_t code = utf8::next(str_i, end); // get 32 bit code of a utf-8 symbol if (code == 0) continue; unsigned char[5] symbol = {0}; utf8::append(code, symbol); // copy code to symbol // ... do something with symbol } while ( str_i < end );
Sur une langue, un mot contient 2 ou plusieurs symboles comme '哈哈' en chinois, devront-on utiliser vecteur
C ++ n'a pas d'installations standard pour traiter le codage UTF-8. Donc, il utilise une bibliothèque distincte ou écrivez le vôtre. L'écriture est possible, mais il y a des zillions de détails.
Oui, c'est la raison pour laquelle je pose la question.