2011-06-01 13 views
0

爲什麼的iconv讀更多的字節我用比我指定

size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); 

爲UTF-16BE轉換成GB2312。

inbytesleft是要轉換的字節數。轉換後,inbytesleft是未轉換的字節數。

經過一次通話,我發現inbytesleft是-2,根據iconv man page這個函數最多可以讀取inbytesleft。 誰能告訴我爲什麼以及如何解決這個問題?

代碼被轉換爲

"保單驗證" 

感謝

+0

發生這種情況時返回代碼和'errno'是什麼? – Mat 2011-06-01 11:00:57

+0

我不知道這個方法的細節,但是你有可能指定了一些字節數,把右邊的切割放在一個UTF-8字符的中間,並且方法選擇了首先完成字符? – 2011-06-01 11:10:51

+0

@Mat返回代碼是(size_t)-1,errno是EILSEQ,意思是「在輸入中遇到了一個無效的多字節序列」。@ Joachim Sauer,unicode完好無損,它是從PDF文件中提取的,代碼可以由adobe reader – PDF1001 2011-06-02 00:27:37

回答

0

你是如何獲取輸入數據到你的程序?

我測試過使用此代碼的情況下,它似乎工作:

#include <stdio.h> 
#include <iconv.h> 
#include <errno.h> 

int main(){ 
    char data[10] = {0x4f,0xdd,0x53,0x55,0x9a,0x8c,0x8b,0xc1, 0, 0}; 
    char outdata[20]; 
    char *dataptr; 
    char *outdataptr; 
    iconv_t cd; 
    size_t result; 
    size_t inbytesleft = 8; 
    size_t outbytesleft = 20; 
    int i; 

    cd = iconv_open("GB2312", "UTF-16BE"); 
    dataptr = data; 
    outdataptr = outdata; 
    result = iconv(cd, &dataptr, &inbytesleft, &outdataptr, &outbytesleft); 
    if(result == -1) 
     printf("Error: %d\n", errno); 
    printf("  result: %zd\n", result); 
    printf(" inbytesleft: %zd\n", inbytesleft); 
    printf("outbytesleft: %zd\n", outbytesleft); 

    for(i = 20; i > outbytesleft; i--){ 
     if(i != 20) 
      printf(","); 
     printf("0x%02x", *((unsigned char *)&(outdata[20-i]))); 
    } 
    printf("\n"); 

    return 0; 
} 

它打印

 result: 0 
inbytesleft: 0 
outbytesleft: 12 
0xb1,0xa3,0xb5,0xa5,0xd1,0xe9,0xd6,0xa4 

這似乎是正確的。

項目在可變數據的陣列是保單驗證

的UTF-16BE編碼。如果這沒有幫助,你可以發佈您的代碼進行分析?

+0

感謝你給我你的答案。我會在你的機器上試試你的代碼並告訴你結果。BTW,你能告訴我你測試了什麼平臺嗎?我的操作系統是CentOS 64bit。 – PDF1001 2011-06-02 10:03:52

+0

@ PDF1001:我使用Ubuntu 10.04 64位。不需要使用任何特殊的編譯標誌'gcc -o name name.c'應該可以正常工作。 我用'echo -n「保證驗證」| iconv -f'UTF-8'-t'UTF-16BE'| hexdump -e'1/1「0x%02x」「,」''獲取字節(因爲我知道我的系統使用UTF-8)並用'echo -e'' echo 0xb1,0xa3,0xb5,0xa5 ,0xd1,0xe9,0xd6,0xa4 | sed -r's /,// g; s/0x/\\\\ x/g'\'| iconv -f GB2312 -t UTF-8'確保我得到相同的結果。 – 2011-06-03 00:29:54

+0

@ PDF1001這方面的進展如何?你有沒有成功? – 2011-08-30 01:42:48