我的GB2312轉化為UTF-8的代碼linux iconv函數為什麼一直返回-1?

為什麼我的GB2312轉化為UTF-8的代碼iconv函數總數失敗返回-1,求高手解答,萬分感謝

int code_convert(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
iconv_t cd;
char **pin = inbuf;
char **pout = outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0)
{
printf("iconv_open failed!!!
");
return -1;
}
memset(outbuf,0,outlen);
if (-1 == iconv(cd,pin,inlen,pout,outlen))
{
printf("iconv failed!!!
");
return -1;
}
iconv_close(cd);
return 0;

}
int GB2312_to_UTF8(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}


返回 -1 就是失敗了,失敗了就要找為什麼失敗。

一般來說你這裡失敗可能有下面的原因:

  1. 你的 gb2312 字元串含有非法的序列。無法成功轉換,請檢查來源字元串是否合法。
  2. 你的源編碼是 gbk ,應該修改為 gbk
  3. 你的源編碼是 gb18030 ,應該修改為 gb18030

預知詳情,請查詢 errno 的值。

PS:

gb2312 是三十多年前的標準,幾十年前就已經升級到了 gb18030,而 Windows 實現了其中的一個子集叫做 gbk,現在你能接觸到的編碼一般會是 gbk 或者 gb18030,如果你使用 gb2312 轉碼是完全可能出錯的。

PPS:

也許這個問題到 StackOverflow 上更合適。


手動執行跟蹤看看

strace iconv -f gb2312 -t utf8 xxx


size_t和int是不是強轉錯了在64位中size_t是8位int是4位


一般來說你這裡失敗可能有下面的原因:

  1. 你的 gb2312 字元串含有非法的序列。無法成功轉換,請檢查來源字元串是否合法。
  2. 你的源編碼是 gbk ,應該修改為 gbk
  3. 你的源編碼是 gb18030 ,應該修改為 gb18030

預知詳情,請查詢 errno 的值。


推薦閱讀:

這個函數是submodular的么?
C++返回類型為類類型的函數返回的臨時變數賦值及生存周期?
求反函數清晰的定義。?
是不是任意曲線都有其對應函數公式?

TAG:編程 | Linux | C編程語言 | 函數 | CC |