Как конвертировать 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 байта.