Rechercher
 

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 :

Fonction mblen

La fonction malloc La fonction mbstowcs


Entête à inclure

#include <stdlib.h>  // <cstdlib> en C++

Fonction mblen

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.

Si le pointeur 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.
pour correctement fonctionner, cette fonction nécessite que vous ayez correctement fixé la localisation à utiliser pour le décodage des caractères. Cela se fait grâce à la fonction 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).

Paramètres

Valeur de retour

La fonction renvoi la taille, exprimée en nombre d'octets, du prochain caractère de la chaîne.

Exemple de code

 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;
}
Exemple d'utilisation de la fonction mblen

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
$> 

Sujets connexes

MB_CUR_MAX
mbstowcs
mbtowc
wcstombs
wctomb


La fonction malloc La fonction mbstowcs