• [^] # Re: Bibliothèques

    Posté par . En réponse au journal Jouons avec Unicode: Tchars, un Dchars pour Troff. Évalué à 4.

    Voilà un petit exemple vite-fait avec iconv, qui prend de l'UCS-4 ("hexadécimal") en entrée et qui sort de l'UTF-8.

    #include <stdio.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <iconv.h>
    #include <endian.h>
    int main(int argc, char **argv)
    {
     uint32_t ucode[] = {
     htobe32(0x0391), /* A */
     htobe32(0x1FB9), /* A& */
     htobe32(0x1FB8), /* A' */
     htobe32(0x1F09), /* A( */
     htobe32(0x1F0D), /* A(/ */
     };
     char buf[32] = "";
     iconv_t cd;
     char *inbuf, *outbuf;
     size_t insize, outsize, status, outlen, i;
     inbuf = (char*)ucode;
     insize = sizeof(ucode);
     outbuf = buf;
     outsize = sizeof(buf);
     outlen = 0;
     cd = iconv_open("UTF-8", "UCS-4BE");
     do
     {
     printf("in: %zu bytes left\n", insize);
     printf("out: %zu bytes left\n", outsize);
     status = iconv(cd, &inbuf, &insize, &outbuf, &outsize);
     if(status == (size_t)-1)
     {
     perror("iconv");
     exit(1);
     }
     } while(insize > 0 && outsize > 0);
     iconv_close(cd);
     outlen = sizeof(buf) - outsize;
     printf("\n");
     printf("Output utf-8: \"%.*s\"\n", (int)outlen, buf);
     printf("\n");
     printf("%zu bytes:\n", outlen);
     for(i=0 ; i<outlen ; i++)
     {
     printf("out[%02zu] = 0x%X\n", i, (uint8_t)buf[i]);
     }
     return 0;
    }