Comment comptez-vous unicode caractères dans un fichier UTF-8 en C++? Peut-être si quelqu'un serait si gentil de me montrer une méthode "autonome", ou alternativement, un court exemple en utilisant http://icu-project.org/index.html. Une erreur importante est que j'ai besoin de construire des comptes de chaque caractère, donc ce n'est pas comme si je comptais le nombre total de caractères, mais le nombre d'occurrences d'un ensemble de caractères.compter les caractères Unicode en C++
Répondre
en UTF-8, un octet non leader a toujours les deux bits supérieurs mis à 10
, donc simplement ignorer tous ces octets. Si cela ne vous dérange pas, vous pouvez faire plus que cela (pour passer au-dessus des octets non-premiers basés sur le modèle binaire d'un octet principal) mais en réalité, il est peu probable de faire beaucoup de différence vous serez généralement proche de la bande passante mémoire de toute façon). Edit: À l'origine, j'ai mal lu votre question en demandant simplement comment compter la longueur d'une chaîne de caractères encodés en UTF-8. Si vous voulez compter les fréquences de caractères, vous voulez probablement convert those to UTF-32/UCS-4, alors vous aurez besoin d'une sorte de matrice clairsemée pour compter les fréquences. La partie la plus difficile concerne le comptage des points de code en fonction des caractères. Par exemple, considérons le caractère "À" - la "lettre majuscule latine A avec tombe". Il y a au moins deux manières différentes de produire ce personnage. Vous pouvez utiliser le code de code U + 00C0, qui encode le tout dans un seul code, ou vous pouvez utiliser le code de code U + 0041 (lettre majuscule latine A) suivi du code de code U + 0300 (Combining grave accent). Normaliser (par rapport à Unicode) signifie transformer tous ces caractères dans la même forme. Vous pouvez soit les combiner en un seul point de code, soit les séparer en points de code distincts. Pour vos besoins, il est probablement plus facile de les combiner en un seul point de code autant que possible. Ecrire ceci par vous-même n'est probablement pas très pratique - j'utiliserais le normalizer API du projet ICU.
+1 pour la normalisation Unicode. Il y a aussi un api win32 pour ça. –
Une discussion avec une routine complète écrite en C++ est à http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html
Si vous savez que la séquence UTF-8 est bien formée, c'est assez facile. Comptez chaque octet qui commence par un bit zéro ou deux bits de un. La première condition va chatcher chaque point de code qui est représenté par un seul octet, la seconde va attraper le premier octet de chaque séquence multi-octets.
while (*p != 0)
{
if ((*p & 0x80) == 0 || (*p & 0xc0) == 0xc0)
++count;
++p;
}
Ou bien comme l'a remarqué dans les commentaires, vous pouvez simplement ignorer chaque octet qui est une continuation:
while (*p != 0)
{
if ((*p & 0xc0) != 0x80)
++count;
++p;
}
Ou si vous voulez être super intelligent et en faire un 2-liner: Le Wikipedia page for UTF-8 montre clairement les modèles.
Je ne considère pas cela comme une question centrée sur la langue. Le format UTF-8 est assez simple. le décoder à partir d'un fichier ne devrait contenir que quelques lignes de code dans n'importe quelle langue.
open file
until eof
if file.readchar & 0xC0 != 0x80
increment count
close file
(file.readchar & 0xC0)! = 0x80. au moins en C,! = a une plus grande priorité que & – jean
Je sais, il est en retard pour ce fil, mais il pourrait aider
avec des trucs de soins intensifs, je l'ai fait comme ceci:
string TheString = "blabla" ;
UnicodeString uStr = UnicodeString::fromUTF8(theString.c_str()) ;
cout << "length = " << uStr.length() << endl ;
- 1. C# Unicode (caractères japonais)
- 2. Nouveaux caractères Unicode en C++ 0x
- 3. Objectif C, unescape caractères unicode
- 4. comment décoder les caractères unicode en php
- 5. compter les caractères dans php
- 6. Comment valider les caractères Unicode?
- 7. UILabel affichant les caractères Unicode
- 8. Comparaison de caractères Unicode C objectif
- 9. caractères Unicode/russes et Win32 api [C++]
- 10. Utilisation de caractères Unicode dans les contrôles C#
- 11. Comment mettre des caractères Unicode sur un System.Windows.Forms.Button en C#?
- 12. Caractères Unicode de JSON.stringify à de vrais caractères Unicode
- 13. Conversion de caractères chinois en Unicode
- 14. caractères Unicode en octets en hexadécimal
- 15. Comment gérer les caractères Unicode (non-ASCII) en Python?
- 16. Comment puis-je compter les caractères en Perl?
- 17. caractères Unicode dans XeLaTeX
- 18. Convertir Unicode entier en caractères Unicode dans SQL Server 2005
- 19. Afficher les caractères Unicode dans TextView Android
- 20. Python "dénormaliser" unicode combinant les caractères
- 21. Caractères minuscules Unicode?
- 22. caractères Unicode Non Affichage
- 23. Python - caractères unicode pyparsing
- 24. Les caractères Unicode n'apparaissent pas dans Zend_Pdf?
- 25. Comment convertir les caractères Unicode en codes d'échappement
- 26. Comment afficher les caractères Unicode dans IE en utilisant HTML
- 27. Remplacer les caractères non-ascii d'une chaîne unicode en Python
- 28. Tables.Select sur caractères Unicode
- 29. Conversion de caractères grecs en Unicode
- 30. Affichage d'un texte Unicode en C#
Voulez-vous compter les caractères ou codepoints? Basé sur votre édition, il semble aussi que vous vous souciez de la normalisation. Toutes les réponses (au moment de l'écriture) concernent le comptage des points de code. –
@Logan: Qu'entendez-vous par "normalisation"? –
Logan a raison. Lien: http://unicode.org/reports/tr15/ –