我的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 就是失敗了,失敗了就要找為什麼失敗。
一般來說你這裡失敗可能有下面的原因:
- 你的 gb2312 字元串含有非法的序列。無法成功轉換,請檢查來源字元串是否合法。
- 你的源編碼是 gbk ,應該修改為 gbk
- 你的源編碼是 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位
一般來說你這裡失敗可能有下面的原因:
- 你的 gb2312 字元串含有非法的序列。無法成功轉換,請檢查來源字元串是否合法。
- 你的源編碼是 gbk ,應該修改為 gbk
- 你的源編碼是 gb18030 ,應該修改為 gb18030
推薦閱讀:
※這個函數是submodular的么?
※C++返回類型為類類型的函數返回的臨時變數賦值及生存周期?
※求反函數清晰的定義。?
※是不是任意曲線都有其對應函數公式?