c语言wchar转化为char_linux 下 wchar_t和char的相互转化

C95标准化了两种表示大型字符集的方法:宽字符(wide

character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte

character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定)自从1994年的增补之后,C语言不只提供char类型,还提供wchar_t类型(宽字符),此类型定义在stddef.h

头文件中。wchar_t指定的宽字节类型足以表示某个实现版本扩展字符集的任何元素。

在多字节字符集中,每个字符的编码宽度都不等,可以是一个字节,也可以是多个字节。源代码字符集和运行字符集都可能包含多字节字符。多字节字符可以被用于字符的常量、字符串字面值(string

literal)、标识符(identifier)、注释(comment),以及头文件。

C语言本身并没有定义或指定任何编码集合,或任何字符集(基本源代码字符集和基本运行字符集除外),而是由其实现指定如何编码宽字符,以及要支持什么类型的多字节字符编码机制。

虽然C标准没有支持Unicode字符集,但是许多实现版本使用Unicode转换格式UTF-16和UTF-32来处理宽字符。如果遵循Unicode标准,wchar_t类型至少是16或32位长,而wchar_t类型的一个值就代表一个Unicode字符。

UTF-8是一个由Unicode

CONsortium(万国码联盟)定义的实现,可以表示Unicode字符集的所有字符。UTF-8字符所使用的空间大小从一个字节到四个字节都有可能。

多字节字符和宽字符(也就是wchar_t)的主要差异在于宽字符占用的字节数目都一样,而多字节字符的字节数目不等,这样的表示方式使得多字节字符串比宽字符串更难处理。比方说,即使字符'A'可以用一个字节来表示,但是要在多字节的字符串中找到此字符,就不能使用简单的字节比对,因为即使在某个位置找到相符合的字节,此字节也不见得是一个字符,它可能是另一个不同字符的一部分。然而,多字节字符相当适合用来将文字存储成文件。

C提供了一些标准函数,可以将多字节字符转换为wchar_t,或将宽字符转换为多字节字符。比方说,如果C

编译器使用Unicode 标准的UTF-16

和UTF-8,那么下面调用wctomb()函数就可以获得字符的多字节表示方式(注:wctomb = wide character to

multibyte)。

#include

#include

#include

#include

using namespace std;

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)

{

setlocale(LC_ALL,"zh_CN.utf8");

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)

{

setlocale(LC_ALL,"zh_CN.utf8");

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(void)

{

setlocale(LC_ALL,"zh_CN.utf8");

printf("1 print chinese by wprintf test: \n");

wchar_t *wstr = L"中文";

//wprintf(L"%ls",wstr);

printf("%ls\n",wstr); //ls

printf("2 print chinese by printf test: \n");

char *str = "汉字";

printf("%s\n\n\n",str); //s

printf("3 char and wchar_t size of system test: \n");

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

//4

printf("%s%d\n\n\n","the size of char is :

",sizeof(char)); //1

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("4 print char test after w2c (wchar to char):\n");

printf("%s\n",pc);

wchar_t *cw1 = c2w(pc); //char

to wchar

char *wc1 = w2c(cw1); //wchar

to char

printf("5 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("6 print char test after c2w and w2c:\n");

printf("%s\n",pmc1);

cout<

return 0;

}

你可能感兴趣的:(c语言wchar转化为char)