wchar_t和char的相互转化和测试


wchar_t和char的具体定义和区别在这里就不赘述了,直接贴转换代码吧。


//根据char字符串为wchar_t串分配空间,根据中英文来分配空间可以避免字节浪费
size_t get_wchar_size(const char *str)
{
size_t len = strlen(str);
size_t size=0;
size_t i;
for(i=0; i < len; i++)
{
   if( str[size] >= 0 && str[size] <= 127 ) //不是全角字符
    size+=sizeof(wchar_t);
   else //是全角字符,是中文
   {
   size+=sizeof(wchar_t);
   i+=2;
   }
}
return size;
}
char *w2c(const wchar_t *pw)
{
if(!pw)
   return NULL;

size_t size= wcslen(pw)*sizeof(wchar_t);
char *pc;
if(!(pc = (char*)malloc(size)))
{
   printf("malloc fail");
   return NULL;
}
wcstombs(pc,pw,size);
return pc;

}
wchar_t *c2w(const char *pc)
{
if(!pc)
   return NULL;

size_t size_of_ch = strlen(pc)*sizeof(char);
size_t size_of_wc = get_wchar_size(pc);
wchar_t *pw;
if(!(pw = (wchar_t*)malloc(size_of_wc)))
{
   printf("malloc fail");
   return NULL;
}
mbstowcs(pw,pc,size_of_wc);
return pw;

}

下面是我的测试代码,经测试基本上是成功的。

int main(int argc, char * argv[])
{
setlocale(LC_ALL,"zh_CN.utf8");
printf("print chinese by wprintf test: \n");
wchar_t *wstr = L"中文";
//wprintf(L"%ls",wstr);
printf("%ls",wstr);

printf("print chinese by printf test: \n");
char *str = "汉字";
printf("%s\n\n\n",str);

printf("char and wchar_t size of system test: \n");
printf("%s%d\n","the size of wchar_t is : ",sizeof(wchar_t));
printf("%s%d\n\n\n","the size of char is : ",sizeof(char));

char *pc;
wchar_t *pw = L"中文是abc一门语言abc";
char *tmp = "中文是abc一门语言abc";
printf("%s%s\n","input test wchar_t* ",tmp);
pc = w2c(pw);
printf("print char test after w2c:\n");
printf("%s\n",pc);
wchar_t *cw1 = c2w(pc);
char *wc1 = w2c(cw1);
printf("print char test after w2c c2w and w2c:\n");
printf("%s\n\n\n",wc1);

char *pmc = "abc中文abc";
wchar_t *pmw;
printf("%s%s\n","input test char* ",pmc);
pmw = c2w(pmc);
char *pmc1 = w2c(pmw);
printf("print char test after c2w and w2c:\n");
printf("%s\n",pmc1);

return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值