我已经按照 link 编写了示例代码使用 iconv 将 ASCII 转换为 UTF-16LE,但输出仅显示单个字符和空格。代码附在下面,请让我知道哪里出错了。
#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);
}
相同的输出如下所示
Input data :Hello world
Data After conversion from ASCII to UTF-16 = H
最佳答案
问题:错误的 scanf()
和错误的 printf()
格式说明符。
scanf("%s",Input);
只扫描非空白。输入“Hello world”只会读入“Hello”。建议改用fgets()
。printf("\n Data ... %s\n ",Output);
中的%s
适用于 C 字符串,不适用于 multi -byte输出
。添加以下内容以查看详细信息: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”相同的宽字符串。
关于从 ASCII 到 utf-16LE 的转换出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20540256/