【问题标题】:conversion from ASCII to utf-16LE giving issues从 ASCII 到 utf-16LE 的转换给出问题
【发布时间】:2013-12-30 16:08:33
【问题描述】:

我按照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);


}

相同的输出如下所示

输入数据:Hello world

从 ASCII 转换为 UTF-16 后的数据 = H

【问题讨论】:

    标签: c encoding iconv libiconv


    【解决方案1】:

    当您将“Hello”转换为 UTF-16LE 时,您最终会得到这个字节序列(以十六进制显示):

    48 00 65 00 6C 00 6C 00 6F 00 00 00
    

    printf 调用表示要打印字符串,就好像它是一个常规的以零结尾的字符串一样。它看到48 并打印一个H,然后它看到00 并认为它已经完成了。

    您需要一个可以将字符串解释为 UTF-16LE 的打印函数。 C 中没有标准的。

    【讨论】:

      【解决方案2】:

      问题:错误的scanf() 和错误的printf() 格式说明符。

      1. scanf("%s",Input); 仅扫描非空白字符。输入“Hello world”只会读入“Hello”。建议改用fgets()

      2. printf("\n Data ... %s \n ",Output); 中的 %s 用于 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
        
      3. printf("\n Data ... %ls \n ",Output); 似乎可以在我的机器上运行(注意l)。但我认为这取决于您的系统是否考虑与“UTF-16LE”相同的宽字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 2013-04-19
        • 2015-02-04
        • 2015-01-14
        • 1970-01-01
        • 2019-12-24
        • 2014-08-14
        相关资源
        最近更新 更多