#include <stdlib.h> // <cstdlib> en C++
int mblen( const char* pChar, size_t maxSize );
Cette fonction permet de déterminer la taille, en nombre d'octets, du premier caractère d'une chaîne multi-octets, mblen
signifiant multibytes
length.
Cela peut notamment être utile pour travailler sur des chaînes UTF-8 (une déclinaison d'Unicode), étant donné que ce standard propose bien plus que 256 caractères.
pChar
est nul (constante NULL
), alors la fonction réinitialise l'état de conversion global et
détermine si des séquences de décalage sont à utiliser.
setlocale
définie dans l'entête <locale.h>
. Par défaut, c'est la localisation "C" qui est
utilisée (en fait, l'encodage ASCII avec ses 128 caractères).
pChar : un pointeur vers le premier octet du caractère à décoder.
maxSize : la taille maximale d'un caractère, en fonction de l'encodage associé à la localisation courante
(la localisation se contrôle via la fonction setlocale
).
La macro MB_CUR_MAX permet de facilement initaliser ce paramètre.
La fonction renvoi la taille, exprimée en nombre d'octets, du prochain caractère de la chaîne.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> size_t mbStrlen( const char * str ) { size_t result = 0; int nbChars; wchar_t extractedChar; // Si mblen renvoi 0, alors on est arrivé à la fin de la chaîne while( ( nbChars = mblen( str, MB_CUR_MAX ) ) ) { // Si mblen renvoi -1, alors il y a eut une erreur durant le décodage de la chaîne. if ( nbChars == -1 ) { fprintf( stderr, "On ne peut pas décoder la chaîne.\n" ); fprintf( stderr, "Vérifiez votre localisation (fonction setlocale).\n" ); exit( -1 ); } // On extrait le caractère multi-octets dans un caractère long (wide char) de type // wchar_t pour facilement le prendre en charge dans la fonction printf. mbtowc( &extractedChar, str, nbChars ); // On affiche le caractère et sa taille en nombre d'octets printf( "%lc -> %d \n", extractedChar, nbChars ); // On passe au caractère suivant str += nbChars; result ++; } return result; } int main() { // On se place en mode UTF-8 pour gérer des caractères multi-octets. setlocale( LC_ALL, "en_US.utf8" ); // On crée une chaîne avec des caractères multi-octets en utilisant l'encodage UTF-8. const char * str = u8"\u03c0 est un sigle mathématique. \u4774 est un idéogramme chinois."; // On calcule le nombre d'octets utilisés par la chaîne (hors '\0'). printf( "%s -> %lu\n", str, strlen( str ) ); // On calcule le nombre de caractères utilisés par la chaîne. printf( "%s -> %lu\n", str, mbStrlen( str ) ); return EXIT_SUCCESS; } |
Et voici les résultats produits par cet exemple :
$> gcc -o sample sample.c $> ./sample π est un sigle mathématique. 䝴 est un idéogramme chinois. -> 62 TODO -> 2 -> 1 e -> 1 s -> 1 t -> 1 -> 1 u -> 1 n -> 1 -> 1 s -> 1 i -> 1 g -> 1 l -> 1 e -> 1 -> 1 m -> 1 a -> 1 t -> 1 h -> 1 é -> 2 m -> 1 a -> 1 t -> 1 i -> 1 q -> 1 u -> 1 e -> 1 . -> 1 -> 1 䝴 -> 3 -> 1 e -> 1 s -> 1 t -> 1 -> 1 u -> 1 n -> 1 -> 1 i -> 1 d -> 1 é -> 2 o -> 1 g -> 1 r -> 1 a -> 1 m -> 1 m -> 1 e -> 1 -> 1 C -> 1 h -> 1 i -> 1 n -> 1 o -> 1 i -> 1 s -> 1 . -> 1 π est un sigle mathématique. 䝴 est un idéogramme chinois. -> 57 $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :