2011-11-23 47 views
2

我想將字符串從GBK字符集轉換爲ISO-8859-1。使用iconv在C/C++中將字符串轉換爲ISO-8859-1

我曾嘗試使用的iconv庫,但iconv()總是返回-1,並errno解碼爲「無效或不完整的多字節字符或寬字符」

我該如何做到這一點?

+2

你能後,可以重現一零二零年線計劃這個問題? – sarnold

+0

這些字符串是否包含非ASCII(例如中文)字符?這可能是轉換例程無法轉換它們的原因。 –

+0

是的,字符串包含非ASCII字符。 – maixl

回答

2

如果你已經打開了轉換描述不//TRANSLIT//IGNORE,然後iconv()會返回一個錯誤,當輸入的字符不能在目標字符集表示。由於ISO-8859-1不能代表大多數GBK字符,所以可能發生了這種情況。下面的例子爲我工作:

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

int main() 
{ 
    char *gbk_str = "GBK \xB5\xE7\xCA\xD3\xBB\xFA"; 
    char dest_str[100]; 
    char *out = dest_str; 
    size_t inbytes = strlen(gbk_str); 
    size_t outbytes = sizeof dest_str; 
    iconv_t conv = iconv_open("ISO-8859-1//TRANSLIT", "GBK"); 

    if (conv == (iconv_t)-1) { 
     perror("iconv_open"); 
     return 1; 
    } 

    if (iconv(conv, &gbk_str, &inbytes, &out, &outbytes) == (size_t)-1) { 
     perror("iconv"); 
     return 1; 
    } 

    dest_str[sizeof dest_str - outbytes] = 0; 
    puts(dest_str); 

    return 0; 
} 

(我希望GBK字符串不是淫穢的,我不知道這意味着什麼!)

+0

我編譯你的例子,用// TRANSLIT打開轉換描述符,它仍然失敗。如果用// IGNORE打開轉換描述符,它可以轉換成功,但忽略非ASCII字符。 – maixl

+0

@maixl:你正在使用哪個'iconv'實現? – caf