Content-type: text/html; charset=UTF-8
/* cc (-static) -o example example.c -lgrapheme */ #include <grapheme.h> #include <stddef.h> #include <stdlib.h> size_t cps_to_utf8(const uint_least32_t *cp, size_t cplen, char *str, size_t len) { size_t i, off, ret; for (i = 0, off = 0; i < cplen; i++, off += ret) { if ((ret = grapheme_encode_utf8(cp[i], str + off, len - off)) > (len - off)) { /* buffer too small */ break; } } return off; } size_t cps_bytelen(const uint_least32_t *cp, size_t cplen) { size_t i, len; for (i = 0, len = 0; i < cplen; i++) { len += grapheme_encode_utf8(cp[i], NULL, 0); } return len; } char * cps_to_utf8_alloc(const uint_least32_t *cp, size_t cplen) { char *str; size_t len, i, ret, off; len = cps_bytelen(cp, cplen); if (!(str = malloc(len))) { return NULL; } for (i = 0, off = 0; i < cplen; i++, off += ret) { if ((ret = grapheme_encode_utf8(cp[i], str + off, len - off)) > (len - off)) { /* buffer too small */ break; } } str[off] = '\0'; return str; }