Namespaces
Variants

mblen

From cppreference.net
Défini dans l'en-tête <stdlib.h>
int mblen ( const char * s, size_t n ) ;

Détermine la taille, en octets, du caractère multioctet dont le premier octet est pointé par s .

Si s est un pointeur nul, réinitialise l'état de conversion global et (jusqu'à C23) détermine si les séquences de décalage sont utilisées.

Cette fonction est équivalente à l'appel mbtowc ( ( wchar_t * ) 0 , s, n ) , sauf que l'état de conversion de mbtowc n'est pas affecté.

Table des matières

Paramètres

s - pointeur vers le caractère multioctet
n - limite du nombre d'octets dans s pouvant être examinés

Valeur de retour

Si s n'est pas un pointeur nul, retourne le nombre d'octets contenus dans le caractère multioctet ou - 1 si les premiers octets pointés par s ne forment pas un caractère multioctet valide ou 0 si s pointe vers le caractère nul ' \0 ' .

Si s est un pointeur nul, réinitialise son état de conversion interne pour représenter l'état de décalage initial et (jusqu'à C23) retourne 0 si l'encodage multioctet actuel n'est pas dépendant de l'état (n'utilise pas de séquences de décalage) ou une valeur non nulle si l'encodage multioctet actuel est dépendant de l'état (utilise des séquences de décalage).

Notes

Chaque appel à mblen met à jour l'état de conversion global interne (un objet statique de type mbstate_t , uniquement connu de cette fonction). Si l'encodage multioctet utilise des états de changement, il faut veiller à éviter le retour en arrière ou les analyses multiples. Dans tous les cas, plusieurs threads ne devraient pas appeler mblen sans synchronisation : mbrlen peut être utilisé à la place.

(jusqu'à C23)

mblen ne peut pas avoir d'état interne.

(depuis C23)

Exemple

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// le nombre de caractères dans une chaîne multioctet est la somme des mblen()
// note : l'approche plus simple est mbstowcs(NULL, str, sz)
size_t strlen_mb(const char* ptr)
{
    size_t result = 0;
    const char* end = ptr + strlen(ptr);
    mblen(NULL, 0); // réinitialiser l'état de conversion
    while(ptr < end) {
        int next = mblen(ptr, end - ptr);
        if (next == -1) {
           perror("strlen_mb");
           break;
        }
        ptr += next;
        ++result;
    }
    return result;
}
void dump_bytes(const char* str)
{
    for (const char* end = str + strlen(str); str != end; ++str)
        printf("%02X ", (unsigned char)str[0]);
    printf("\n");
}
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char* str = "z\u00df\u6c34\U0001f34c";
    printf("La chaîne \"%s\" contient %zu caractères, mais %zu octets : ",
            str, strlen_mb(str), strlen(str));
    dump_bytes(str);
}

Sortie possible :

La chaîne "zß水🍌" contient 4 caractères, mais 10 octets : 7A C3 9F E6 B0 B4 F0 9F 8D 8C

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.22.7.1 La fonction mblen (p: 260)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.22.7.1 La fonction mblen (p: 357)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.20.7.1 La fonction mblen (p: 321)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 4.10.7.1 La fonction mblen

Voir aussi

convertit le caractère multioctet suivant en caractère large
(fonction)
(C95)
retourne le nombre d'octets dans le prochain caractère multioctet, avec état donné
(fonction)