Comment connaître le nombre de caractères dans la chaîne utf8

Je veux savoir s’il existe un moyen simple de déterminer le nombre de caractères dans la chaîne UTF8 . Par exemple, dans Windows, cela peut être fait par:

  1. convertir la chaîne UTF8 chaîne wchar_t
  2. utiliser la fonction wcslen et obtenir le résultat

Mais j’ai besoin d’une solution plus simple et multiplateforme.

Merci d’avance.

Le concept entier de “nombre de caractères” ne s’applique pas vraiment à Unicode, car les codes ne mappent pas 1: 1 aux glyphes. La méthode proposée par @borrible est acceptable si vous souhaitez définir les exigences de stockage sous une forme non compressée, mais c’est tout ce qu’elle peut vous dire.

Par exemple, il existe des points de code tels que “l’espace zéro largeur”, qui ne prennent pas de place à l’écran lors du rendu, mais occupent un sharepoint code, ou des modificateurs pour les signes diacritiques ou les voyelles. Toute statistique devrait donc être spécifique à l’application concrète.

Un bon rendu Unicode aura une fonction qui peut vous dire combien de pixels seront utilisés pour le rendu d’une chaîne si cette information est ce que vous cherchez.

Les caractères UTF-8 sont des octets simples où le bit le plus à gauche est un 0 ou plusieurs octets où le premier octet a le bit le plus à gauche 1..10... (avec le nombre de 1 à gauche 2 ou plus ) suivis d’octets successifs de la forme 10... (c’est-à-dire un seul 1 à gauche). En supposant que votre chaîne soit bien formée, vous pouvez parcourir tous les octets et incrémenter votre “décompte de caractères” chaque fois que vous voyez un octet qui n’a pas la forme 10... personnages.

Si la chaîne est réputée être valide UTF-8, prenez simplement la longueur de la chaîne en octets, à l’exclusion des octets dont les valeurs sont comsockets dans la plage 0x80-0xbf:

 size_t i, cnt; for (cnt=i=0; s[i]; i++) if (s[i]<0x80 || s[i]>0xbf) cnt++; 

Notez que s doit pointer sur un tableau de caractères unsigned char pour que les comparaisons fonctionnent.