我已经按照link编写了一个示例代码,使用iconv将ASCII转换为UTF-16LE,但输出只显示了一个charecter和blankspaces。代码附在下面,请告诉我哪里出错了。
#include <iconv.h>
#include <stdio.h>
#include <string.h>
int main()
{
char Input[20];
char Output[100];
size_t insize,out_size;
memset(Input,0,sizeof(Input));
memset(Output,0,sizeof(Output));
int nconv=0;
char *Inptr;
char *outptr;
printf("Input data :");
scanf("%s",Input);
iconv_t cd = iconv_open("UTF-16LE","ASCII");
if(cd==(iconv_t)-1)
{
printf("iconv_open has failed ");
return 0;
}
insize=strlen(Input);
out_size=3*insize;
Inptr =Input;
outptr=(char *)Output;
nconv=iconv(cd,&Inptr,&insize,&outptr,&out_size);
if(nconv!=0)
{
printf("Unable to perform conversion ");
return 0;
}
printf("\n Data After conversion from ASCII to UTF-16 = %s \n ",Output);
}
相同的输出如下所示
输入数据:Hello world
数据从ASCII转换为UTF-16 = H
答案 0 :(得分:3)
问题:错误的scanf()
和错误的printf()
格式说明符。
scanf("%s",Input);
仅扫描非空白区域。输入“Hello world”只会读入“Hello”。建议改为使用fgets()
。
%s
中的printf("\n Data ... %s \n ",Output);
用于C字符串,而不是用于多字节Output
。添加以下内容以查看详细信息:
for (size_t i=0; i<out_size*2; i++)
printf("%3d:%3d\n", i, Output[i]);
0: 72
1: 0
2:101
3: 0
4:108
5: 0
6:108
7: 0
8:111
9: 0
printf("\n Data ... %ls \n ",Output);
似乎可以在我的计算机上运行(请注意l
)。但我认为这取决于你的系统考虑宽字符串与“UTF-16LE”相同。
答案 1 :(得分:1)
将“Hello”转换为UTF-16LE时,最终会得到这个字节序列(以十六进制显示):
48 00 65 00 6C 00 6C 00 6F 00 00 00
printf调用表示打印字符串,好像它是一个常规的以零结尾的字符串。它会看到48
并打印H
,然后它会看到00
并认为已完成。
您需要一个可以将字符串解释为UTF-16LE的打印功能。 C中没有标准的。