diumenge, 23 d’agost del 2020

Funcions stdlib [9/9]: mblen, mbstowcs, mbtowc, wctomb

Manipulació memòries multibytes:


Les següentes funcions treballen amb Caràcters multibytes.


Funció mblen:     int mblen(const char *str,size_t n);


Retorna la longitud d’un caràcter multi-byte apuntat, per l’argument str .


str - Aquest és el punter al primer byte d'un caràcter multibyte.
n - Aquest és el nombre màxim de bytes que cal comprovar per a la longitud de caràcters.


La funció mblen () retorna el nombre d'octals passats de la seqüència de múltiples bytes a partir de str, si es reconeix com un caràcter ample no nul. Retorna 0, si es reconeix un caràcter nul ample  torna -1, si s'ha trobat una seqüència de bytes múltiples no vàlida o si no es pot analitzar un caràcter multi-byte complet.


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

int main () {
   int len;
   char *pmbnull  = NULL;
   char *pmb = (char *)malloc( MB_CUR_MAX );
   wchar_t *pwc = L"Hi";
   wchar_t *pwcs = (wchar_t *)mallocsizeofwchar_t ));

   printf("Conversió a cadena multibyte\n");
   len = wcstombspmb, pwc, MB_CUR_MAX);
   printf("Caracters convertits %d\n"len);
   printf("Valor hexadecimal del primer caràcter multibyte: %#.4x\n"pmb);
   
   len = mblenpmb, MB_CUR_MAX );
   printf"Longitud en bytes de caràcter multibyte %x: %u\n"pmblen );
   
   pmb = NULL;
   
   len = mblenpmb, MB_CUR_MAX );
   printf"Longitud en bytes de caràcter multibyte %x: %u\n"pmblen );
   
   return(0);
}


Funció mbstowcs:      size_t mbstowcs(wchar_t *pwcs, const char *str, size_t n);


Converteix la cadena de caràcters de múltiples bytes a la qual es fa referència, per l’argument str a la matriu a la qual s’apunten pwcs .




pwcs : aquest és el punter a una matriu d'elements wchar_t que és prou llarg per emmagatzemar una cadena ampla de caràcters de màxim. 
 
str : Aquesta és la cadena de caràcters C de diversos bytes que s’ha d’interpretar. 
 
n - Aquest és el nombre màxim de caràcters wchar_t a interpretar.


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

int main () {
   int len;
   char *pmbnull  = NULL;
   char *pmb = (char *)malloc( MB_CUR_MAX );
   wchar_t *pwc = L"Hi";
   wchar_t *pwcs = (wchar_t *)mallocsizeofwchar_t ));

   printf("Conversió a cadena multibyte\n");
   len = wcstombspmb, pwc, MB_CUR_MAX);
   printf("Caracters convertits %d\n"len);
   printf("Valor hexadecimal del primer caràcter multibyte: %#.4x\n"pmb);
   
   printf("Tornant a la cadena de caràcters amples\n");
   len = mbstowcs( pwcs, pmb, MB_CUR_MAX);
   printf("Caracters convertits %d\n"len);
   printf("Valor hexadecimal del primer caràcter ampli %#.4x\n\n", pwcs);
   
   return(0);
}





Funció mbtowc:      int mbtowc(wchar_t *pwc, const char *str, size_t n);


Converteix una seqüència multibyte en un caràcter ampli.


pwc - Aquest és el punter a un objecte del tipus wchar_t.

str - Aquest és el punter al primer byte d'un caràcter de diversos bytes.

n - Aquest és el nombre màxim de bytes que cal comprovar per a la longitud de caràcters.


Si str no és NULL, la funció mbtowc () retorna el nombre de bytes consumits a partir de str, o 0 si s apunta a un byte nul, o -1 al fracàs.

Si str és NULL, la funció mbtowc () retorna nul si la codificació té un estat de desplaçament no trivial o zero si la codificació està sense estat.


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

int main () {
   char *str = "Aixos es un punter";
   wchar_t mb[100];
   int len;
   
   len = mblen(NULL, MB_CUR_MAX);       
   mbtowc(mbstrlen*strlen(str) );
   wprintf(L"%ls \n"mb );   
   
   return(0);
}




Funció wctomb:      int wctomb(char *str, wchar_t wchar);


Converteix l'ample wchar de caràcters a la seva representació multibyte i el guarda al començament de la matriu de caràcters apuntada per str .

str - Aquest és el punter a una matriu prou gran com per contenir un caràcter multibyte,
wchar : aquest és el caràcter ampli del tipus wchar_t.


Si str no és NULL, la funció wctomb () retorna el nombre d'octets que s'han escrit a la matriu de bytes a str. Si wchar no es pot representar com una seqüència multibyte, es retorna -1.

Si str és NULL, la funció wctomb () retorna nul si la codificació té un estat de desplaçament no trivial, o zero si la codificació està sense estat.


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

int main () {
   int i;
   wchar_t wc = L'a';
   char *pmbnull = NULL;
   char *pmb = (char *)malloc(sizeofchar ));

   printf("Conversio de caracter ampli:\n");
   i = wctombpmbwc );
   printf("caracters convertits: %u\n"i);
   printf(": %.1s\n"pmb);

   printf("Intenteu convertir la destinacio quan es NULL:\n");
   i = wctombpmbnullwc );
   printf("Caracters convertits: %u\n"i);
   /* això no imprimirà cap valor */
   printf("Multibyte caracter: %.1s\n"pmbnull);
   
   return(0);
}





Més informació ->  Memòries: Caràcters multibytes
Més informació ->  Estructures stdlib
Més informació ->  Macros stdlib.h


Més informació ->  llibreria <stdlib.h>