UTF-16 文字の文字列を出力しようとしています。しばらく前にこの質問を投稿しましたが、iconv を使用して UTF-32 に変換し、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 文字列が OK を出力する場合があります。また、wchar_t の出力中に問題が発生したように見え、printf 関数呼び出しを完全に終了させて、末尾の「***」も出力されないようにすることもあります。
私も使ってみました
wprintf(((wchar_t*) "*** %ls ***\n"), out_buf));
しかし、何も印刷されません。
ここで何か不足していますか?
アップデート
コメントにいくつかの提案を組み込みました。
更新されたコード:
// *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 バイトであることを確認しました。