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;
}