从 ASCII 到 utf-16LE 的转换出现问题

标签 c encoding iconv libiconv

我已经按照 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() 格式说明符。

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

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

关于从 ASCII 到 utf-16LE 的转换出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20540256/

相关文章:

c - 使用 fgets 将字符串从文件流读取到字符数组中。 [C]

c++ - 如何在 dev c++ 上运行客户端服务器程序?

Java FX - Cp1252 字符编码错误

php - 阿塞拜疆语 到 ASCII 音译

node.js - Nodejs jsdom编码

r - 由于 "undefined reference to ` libiconv'",安装 R 失败

c - 为什么我得到不同的值 "a"。为了获得相同的值需要做什么?

c - 如何判断一个整数是否属于某个整数范围?

android - 智能手机(Android、iOS 等)上的 DRM

java - 从 http GET 响应获取图像作为 base64 字符串