mblen
|
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 à
|
(jusqu'à C23) |
|
|
(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) |
|
Documentation C++
pour
mblen
|
|