11
votes

C ++ ITERE ou SPLIT UTF-8 String dans des symboles?

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.

Veuillez poster un extrait de code.

résolu: C ++ itérer ou diviser uf-8 chaîne dans le tableau de symboles?


2 commentaires

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.


5 Réponses :


1
votes

3 commentaires

"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.



30
votes

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 );


1 commentaires

Belle réponse! Ceci est exactement ce que je cherchais! Merci!



0
votes

éteint le brassard: xxx


6 commentaires

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 'à 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.



2
votes

UTF8 CPP est exactement ce que vous voulez


1 commentaires

J'ai déjà trouvé cette bibliothèque par moi-même. J'avais besoin d'un code, mais merci quand même.



13
votes

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 );


1 commentaires

Sur une langue, un mot contient 2 ou plusieurs symboles comme '哈哈' en chinois, devront-on utiliser vecteur pour stocker un mot? Si tel est le cas, la comparaison des mots semble avoir besoin d'itération du vecteur / de la matrice et il semble assez lent ...