c语言char和wchar_t 转换

       最近遇到一个在C语言当中处理中文的问题,因为汉字和ascii不同,汉字是多字节编码方式,ascii只用一个字节表示,所以在用c语言提供的strlen函数得到的长度是字节长度;  以下都是utf-8编码方式,为了得到一个字符(汉字和ascii)有几种处理方式:

 

        1.  自己写程序判断是否为汉字,通过第一个字节判断,以下是我写的一部分代码;

 

             int isHanzi(int a) { int t = a & 0xE0; if(t==0xE0){ printf("汉字1/n"); return 3; } t = a & 0xC0; if(t==0xC0){ return 2; } t = a & 0xF0; if(t==0xF0){ return 4; } t = a & 0xF8; if(t==0xF8){ return 5; } t = a & 0xFC; if(t==0xFC){ return 2; } printf("不是/n"); return 1; }

 

          2.   用内置的wchar_t类型

                     1).  wchar_t ws[]=L"北京bus";

                                这样用wcslen(ws)结果就为 5,

                              int i; setlocale(LC_ALL, "zh_CN.UTF-8"); int len=wcslen(ws); for(i=0; i

                          这是必须设置 本地编码方式  setlocale(LC_ALL,"zh_CN.UTF-8");

                     2).读一个文件后得到的数据,要使数据为wchar_t ,就需要进行字符串转换了.用到函数  mbstowcs,以下是我写的一个读文本文  件然后转换的程序

                            //读一个文本文件 FILE *fp = fopen("/home/wyt/data.txt","r"); char buffer[1024]; size_t realLen=0,curLen,length=2048; char *data=(char *)malloc(sizeof(char)*length); char *tmp; while(!feof(fp)){ curLen = fread(buffer,sizeof(char),1024,fp); realLen+=curLen; if(length<=realLen){ tmp = (char *)malloc(sizeof(char)*(length+2048)); memcpy(tmp,data,sizeof(char)*length); length+=2048; free(data); data=tmp; } strcat(data,buffer); } data[realLen]='/0'; printf("%s",data); fclose(fp); wchar_t *data2 = (wchar_t *)malloc(sizeof(wchar_t)*length); //转换成wchar_t类型 mbstowcs(data2,data,length); size_t ln=wcslen(data2); for(i=0;i

 

 

 

                 如果 wchar_t 转换为char 类型,可以用函数 wcstombs

                             void out(wchar_t name) { if(name<128){ char n[2]; wcstombs(n,&name,sizeof(wchar_t)); n[1]='/0'; printf("%lc,%s,%d/n",name,n,strlen(n)); }else{ char n[3]; wcstombs(n,&name,sizeof(wchar_t)); n[3]='/0'; printf("%lc,%s,%d/n",name,n,strlen(n)); } //n[3]='/0'; }

 

 

 

 

 

你可能感兴趣的:(c语言char和wchar_t 转换)