windows使用api, linux使用iconv
char *_utf8_2_gbk (const char *content) {
#if (defined __WIN32__) || (defined WIN32)
int len = 0;
char *dst = NULL;
unsigned short *ansi = NULL;
len = MultiByteToWideChar(CP_UTF8, 0, content, -1, NULL, 0);
ansi = (unsigned short*)malloc(sizeof(unsigned short)*len);
if (!ansi)
return NULL;
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)content, -1, ansi, len);
len = WideCharToMultiByte(CP_ACP, 0, ansi, -1, NULL, 0, NULL, NULL);
dst = (char *)malloc(len + 1);
if (!dst)
{
free(ansi);
return NULL;
}
WideCharToMultiByte(CP_ACP,0, ansi, -1, dst, len, NULL, NULL);
dst[len] = '\0';
free(ansi);
return dst;
#else
iconv_t cd;
char *ansi_data = NULL;
size_t content_len = 0, ansi_data_len = 0;
if (!content)
return NULL;
content_len = strlen(content);
if (content_len == 0)
return NULL;
cd = iconv_open("gb2312", "utf8");
if (cd == 0)
return NULL;
ansi_data_len = content_len*4 + 1;
ansi_data = (char*)malloc(ansi_data_len);
if (!ansi_data)
return NULL;
memset(ansi_data, 0, ansi_data_len);
char *in = (char*)content;
char *out = ansi_data;
if (iconv(cd, &in, (size_t*)&content_len, &out, (size_t*)&ansi_data_len) == -1)
{
iconv_close(cd);
free(ansi_data);
return NULL;
}
iconv_close(cd);
return ansi_data;
#endif
}
char *_gbk_2_utf8 (const char *content) {
#if (defined __WIN32__) || (defined WIN32)
int len = 0;
char *dst = NULL;
unsigned short *utf8 = NULL;
len = MultiByteToWideChar(CP_ACP, 0, content, -1, NULL, 0);
utf8 = (unsigned short*)malloc(sizeof(unsigned short)*len);
if (!utf8)
return NULL;
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)content, -1, utf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, utf8, -1, NULL, 0, NULL, NULL);
dst = (char *)malloc(len + 1);
if (!dst)
{
free(utf8);
return NULL;
}
WideCharToMultiByte(CP_UTF8,0, utf8, -1, dst, len, NULL, NULL);
free(utf8);
dst[len] = '\0';
return dst;
#else
iconv_t cd;
char *utf8_data = NULL;
size_t content_len = 0, utf8_data_len = 0;
if (!content)
return NULL;
content_len = strlen(content);
if (content_len == 0)
return NULL;
cd = iconv_open("utf8", "gb2312");
if (cd == 0)
return NULL;
utf8_data_len = content_len*4 + 1;
utf8_data = (char*)malloc(utf8_data_len);
if (!utf8_data)
return NULL;
memset(utf8_data, 0, utf8_data_len);
char *in = (char*)content;
char *out = utf8_data;
if (iconv(cd, &in, (size_t*)&content_len, &out, (size_t*)&utf8_data_len) == -1)
{
iconv_close(cd);
free(utf8_data);
return NULL;
}
iconv_close(cd);
return utf8_data;
#endif
}