我想打印出一串UTF-16字符。我后来发布了这个问题,给出的建议是使用iconv转换为UTF-32并将其打印为wchar_t字符串。如何将UTF-16转换为UTF-32并在C中打印结果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,所以我想转换应该是OK?
然而,印刷似乎是碰运气。有时候转换后的wchar_t字符串会打印OK。其他时候,它在打印wchar_t时似乎遇到问题,并且完全终止printf函数调用,使得即使是后面的“***”也不会被打印。
我也使用
wprintf(((wchar_t*) "*** %ls ***\n"), out_buf));
尝试,但从来都没有被打印出来。
我在这里错过了什么吗?
参考:How to Print UTF-16 Characters in C?
UPDATE
纳入一些在意见建议。
更新的代码:
// *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个字节。
'wprintf()'需要格式字符串具有'L'前缀,例如'wprintf(L“***%ls *** \ n”,out_buf)'。 –
你为什么要将输入复制到本地缓冲区'in_buf'?只需直接使用'c' ... –
你也不能合法地将指向'char'数组的指针指向'wchar_t'指针。输出缓冲区需要有'wchar_t [n]'类型。 –