Contar caracteres versus bytes #6

Open
opened 2025-05-01 11:00:58 -03:00 by NRZCode · 1 comment

Uma dúvida sobre caracteres e bytes.
Na maioria dos casos 1 byte = 1 caracter, porém quando temos caracteres acentuados, emojis, etc, temos caracteres de multibyte.
Qual deveria ser a abordagem ou técnica para contar os caracteres de uma string?

int main(void) {
    char *str = "String com acentuação, 🤘";
    int len = strlen(str);
    printf("O comprimento da string [%s] é %d\n", str, len);
    exit(EXIT_SUCCESS);
}
$ ./a.out
O comprimento da string [String com acentuação, 🤘] é 29
$ echo ${#str}
24
Uma dúvida sobre caracteres e bytes. Na maioria dos casos 1 byte = 1 caracter, porém quando temos caracteres acentuados, emojis, etc, temos caracteres de multibyte. Qual deveria ser a abordagem ou técnica para contar os caracteres de uma string? ```c int main(void) { char *str = "String com acentuação, 🤘"; int len = strlen(str); printf("O comprimento da string [%s] é %d\n", str, len); exit(EXIT_SUCCESS); } ``` ```sh $ ./a.out O comprimento da string [String com acentuação, 🤘] é 29 $ echo ${#str} 24 ```
Owner

@NRZCode wrote in #6 (comment):

Qual deveria ser a abordagem ou técnica para contar os caracteres de uma string?

Utilizar as funções mblen ou mbstowcs (em stdlib.h), sem esquecer de determinar a localidade com setlocale (locale.h):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

int main(void) {
    const char *str = "olá 😊 mundo";  // UTF-8
    
    setlocale(LC_ALL, "");

    // Método 1: usando mbstowcs
    size_t n_chars_mbstowcs = mbstowcs(NULL, str, 0);

    // Método 2: usando mblen em loop
    size_t n_chars_mblen = 0;
    const char *p = str;
    int len;

    while (*p) {
        len = mblen(p, MB_CUR_MAX);
        p += len;
        n_chars_mblen++;
    }

    printf("String: \"%s\"\n", str);
    printf("strlen (bytes)            :  %zu\n", strlen(str));
    printf("Contagem com mbstowcs     :  %zu\n", n_chars_mbstowcs);
    printf("Contagem com mblen em loop:  %zu\n", n_chars_mblen);

    return 0;
}

Compilando e testando:

:~$ gcc -Wall teste.c
:~$ ./a.out
String: "olá 😊 mundo"
strlen (bytes)            :  15
Contagem com mbstowcs     :  11
Contagem com mblen em loop:  11
@NRZCode wrote in https://bolha.dev/blau_araujo/cblc/issues/6#issue-6: > Qual deveria ser a abordagem ou técnica para contar os caracteres de uma string? Utilizar as funções `mblen` ou `mbstowcs` (em `stdlib.h`), sem esquecer de determinar a localidade com `setlocale` (`locale.h`): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main(void) { const char *str = "olá 😊 mundo"; // UTF-8 setlocale(LC_ALL, ""); // Método 1: usando mbstowcs size_t n_chars_mbstowcs = mbstowcs(NULL, str, 0); // Método 2: usando mblen em loop size_t n_chars_mblen = 0; const char *p = str; int len; while (*p) { len = mblen(p, MB_CUR_MAX); p += len; n_chars_mblen++; } printf("String: \"%s\"\n", str); printf("strlen (bytes) : %zu\n", strlen(str)); printf("Contagem com mbstowcs : %zu\n", n_chars_mbstowcs); printf("Contagem com mblen em loop: %zu\n", n_chars_mblen); return 0; } ``` Compilando e testando: ``` :~$ gcc -Wall teste.c :~$ ./a.out String: "olá 😊 mundo" strlen (bytes) : 15 Contagem com mbstowcs : 11 Contagem com mblen em loop: 11 ```
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: blau_araujo/cblc#6
No description provided.