Как конвертировать UTF-16 в UTF-32 и распечатать результат wchar_t в C?

я пытаюсь распечатать строку символов UTF-16. Я опубликовал этот вопрос некоторое время назад, и мне был дан совет, чтобы конвертировать в UTF-32 с помощью iconv и распечатать его как строку wchar_t.

Я провел некоторые исследования и сумел написать следующее:

// *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));

Вызов iconv всегда возвращает 0, так что я думаю, что преобразование должно быть в порядке?

Тем не менее, печать, кажется, ударил и пропустил. Время от времени преобразованная строка wchar_t печатает ОК. В других случаях кажется, что проблема возникает при печати wchar_t, и вообще завершает вызов функции printf, так что даже завершающий символ "***" не печатается.

я также пытался использовать

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

но ничего не печатается.

Я что-то здесь упускаю?

Ссылка:Как напечатать символы UTF-16 в C?

ОБНОВИТЬ

включены некоторые предложения в комментариях.

обновленный код:

// *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);

результат тот же, но не все строки UTF-16 печатаются (и printf, и wprintf).

что еще я мог пропустить?

Кстати, я использую Linux, и проверил, что wchar_t составляет 4 байта.

Ответы на вопрос(1)

Ваш ответ на вопрос