Namespaces
Variants

mbtowc

From cppreference.net
Défini dans l'en-tête <stdlib.h>
int mbtowc ( wchar_t * pwc, const char * s, size_t n )
(jusqu'à C99)
int mbtowc ( wchar_t * restrict pwc, const char * restrict s, size_t n )
(depuis C99)

Convertit un caractère multioctet dont le premier octet est pointé par s en un caractère large, écrit dans * pwc si pwc n'est pas nul.

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

Table des matières

Notes

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

Paramètres

pwc - pointeur vers le caractère large pour la sortie
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 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).

Exemple

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
// print multibyte string to wide-oriented stdout
// equivalent to wprintf(L"%s\n", ptr);
void print_mb(const char* ptr)
{
    mbtowc(NULL, NULL, 0); // reset the conversion state
    const char* end = ptr + strlen(ptr);
    int ret = 0;
    for (wchar_t wc; (ret = mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret)
        wprintf(L"%lc", wc);
    wprintf(L"\n");
}
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    // UTF-8 narrow multibyte encoding
    print_mb("z\u00df\u6c34\U0001F34C"); // or "zß水🍌"
}

Sortie :

zß水🍌

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 7.24.7.2 La fonction mbtowc (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.22.7.2 La fonction mbtowc (p: 260)
  • Norme C11 (ISO/IEC 9899:2011):
  • 7.22.7.2 La fonction mbtowc (p: 358)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.20.7.2 La fonction mbtowc (p: 322)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 4.10.7.2 La fonction mbtowc

Voir aussi

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