#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <errno.h>
#include <locale.h>
#include <fcntl.h>
#include <unistd.h>
#include <iconv.h>
/*
* 对字符串进行语言编码转换
*
*/
int convert(const char *form, const char *to, char *save, int savelen, char *src, int srclen)
{
iconv_t cd;
const char *inbuf = src;
char *outbuf = save;
size_t outbufsize = savelen;
int status = 0;
size_t savesize = 0;
size_t inbufsize = srclen;
const char *inptr = inbuf;
size_t insize = inbufsize;
char *outptr = outbuf;
size_t outsize = outbufsize;
cd = iconv_open(to, form);
iconv(cd, NULL, NULL, NULL, NULL);
if (inbufsize == 0) {
status = -1;
goto done;
}
while(insize > 0) {
size_t res = iconv(cd, (char**)&inptr, &insize, &outptr, &outsize);
if (outptr != outbuf) {
int saved_errno = errno;
int outsize = outptr-outbuf;
strncpy(save+savesize, outbuf, outsize);
errno = saved_errno;
}
if (res == (size_t)(-1)) {
if (errno == EILSEQ) {
int one = 1;
iconvctl(cd, ICONV_SET_DISCARD_ILSEQ, &one); //忽略无效序列并继续转换
status = -3;
}
} else if (errno == EINVAL) {
if (inbufsize == 0) {
status = -4;
goto done;
} else {
break;
}
} else if (errno == E2BIG) {
status = -5;
goto done;
} else {
status = -6;
goto done;
}
}
status = strlen(save);
done:
iconv_close(cd);
return status;
}
/*
* 例: 字符串(GB2312) unicode
* 工作愉快!,->5DE54F5C61095FEBFF01
*/
int main(int argc, char *argv[])
{
char sdata[40] = {"工作愉快!"};
char ddata[40] = {0};
convert("UTF-8", "GB2312", ddata, sizeof(ddata), sdata, sizeof(sdata));
printf("ddata:%s\r\n",ddata);
return 0;
}