Como converter UTF-16 em UTF-32 e imprimir o resultado wchar_t em C?

Estou tentando imprimir uma sequência de caracteres UTF-16. Eu postei essa pergunta há um tempo e o conselho dado foi converter para UTF-32 usando iconv e imprimi-lo como uma string de wchar_

Eu fiz algumas pesquisas e consegui codificar o seguinte:

// *c is the pointer to the characters (UTF-16) i'm trying to print
// sz is the size in bytes of the input i'm trying to print

iconv_t icv;
char in_buf[sz];
char* in;
size_t in_sz;
char out_buf[sz * 2];
char* out;
size_t out_sz;

icv = iconv_open("UTF-32", "UTF-16");

memcpy(in_buf, c, sz);

in = in_buf;
in_sz = sz;
out = out_buf;
out_sz = sz * 2;

size_t ret = iconv(icv, &in, &in_sz, &out, &out_sz);
printf("ret = %d\n", ret);
printf("*** %ls ***\n", ((wchar_t*) out_buf));

A chamada iconv sempre retorna 0, então acho que a conversão deve estar O

No entanto, a impressão parece ser um sucesso. Às vezes, a sequência wchar_t convertida é impressa em OK. Outras vezes, parece haver um problema ao imprimir o wchar_t e finaliza a chamada da função printf de maneira que até o "***" à direita não seja impresso.

i também tentei usar

wprintf(((wchar_t*) "*** %ls ***\n"), out_buf));

mas nada nunca é impress

Estou perdendo alguma coisa aqui?

Reference:Como imprimir caracteres UTF-16 em C?

ATUALIZA

incorporou algumas das sugestões nos comentário

código atualizado:

// *c is the pointer to the characters (UTF-16) i'm trying to print
// sz is the size in bytes of the input i'm trying to print

iconv_t icv;
char in_buf[sz];
char* in;
size_t in_sz;
wchar_t out_buf[sz / 2];
char* out;
size_t out_sz;

icv = iconv_open("UTF-32", "UTF-16");

memcpy(in_buf, c, sz);

in = in_buf;
in_sz = sz;
out = (char*) out_buf;
out_sz = sz * 2;

size_t ret = iconv(icv, &in, &in_sz, &out, &out_sz);
printf("ret = %d\n", ret);
printf("*** %ls ***\n", out_buf);
wprintf(L"*** %ls ***\n", out_buf);

ainda o mesmo resultado, nem todas as seqüências UTF-16 são impressas (a printf e a wprintf

o que mais eu poderia estar perdendo?

btw, estou usando o Linux e verificamos que wchar_t tem 4 byte

questionAnswers(1)

yourAnswerToTheQuestion