2013-12-12 40 views
1

我已經編寫了一個示例代碼,遵循link使用iconv將ASCII轉換爲UTF-16LE,但輸出只顯示了一個單一的文字和空格。代碼附在下面,請讓我知道我要去哪裏錯了。從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); 


} 

對於相同的輸出如下

輸入數據給出:你好世界

數據從ASCII轉換爲UTF-16 = H後

回答

1

當您將「你好」,以UTF-16LE,你結束了這個字節序列(十六進制表示):

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

的printf的電話說要打印字符串,就好像它是一個常規零終止的字符串。它看到48並打印一個H,然後它看到00它認爲它已完成。

您需要一個可以將字符串解釋爲UTF-16LE的打印函數。 C中沒有標準的一個。

3

問題:錯誤的scanf()和錯誤的printf()格式說明符。

  1. scanf("%s",Input);只掃描非空白。進入「Hello world」只會在「你好」中讀到。建議使用fgets()代替。

  2. %s in 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 
    
  3. printf("\n Data ... %ls \n ",Output);出現在我的機器上工作(注意l)。但我認爲這取決於您的系統考慮與「UTF-16LE」相同的寬字符串。