i'm trying to print out a string of UTF-16 characters. i posted this question a while back and the advice given was to convert to UTF-32 using iconv and print it as a string of wchar_t.
i've done some research, and managed to code the following:
// *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));
The iconv call always return 0, so i guess conversion should be OK?
However, printing seems to be hit and miss. At times the converted wchar_t string prints OK. Other times, it seems to hit problem while printing the wchar_t, and terminates the printf function call altogether such that even the trailing "***" does not get printed.
i also tried using
wprintf(((wchar_t*) "*** %ls ***\n"), out_buf));
but nothing ever gets printed.
Am i missing something here?
Reference: How to Print UTF-16 Characters in C?
UPDATE
incorporated some of the suggestions in the comments.
updated code:
// *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);
still the same result, not all the UTF-16 strings get printed (both the printf and the wprintf).
what else could i be missing?
btw, i'm using Linux, and have verified that wchar_t is 4 bytes.
wprintf()
needs the format string to have theL
prefix, e.g.wprintf(L"*** %ls ***\n", out_buf)
. – Paramountin_buf
? Just usec
directly... – Hoggchar
array to a pointer towchar_t
. The output buffer needs to have typewchar_t [n]
. – Hoggwchar_t
, Win doesn't. – Mayce