Windows和linux的utf8,Windows与Linux UTF8/GBK相互转换

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值