wchar_t转char
wchar_t的类型定义

wchar_t的类型定义【wchar_t的类型定义】在C++语言中,wchar_t是一种用于表示宽字符的数据类型。
它是宽字符类型的一种实现方式,用于在多语言编程中支持特定字符集的编码方式,例如Unicode编码。
wchar_t类型的定义可以根据不同的编译器和平台而有所不同,下面将一步一步回答有关wchar_t类型定义的问题。
一、wchar_t的基本介绍wchar_t是一种用于表示宽字符的数据类型,它至少能够容纳一个本地字符集的所有字符。
宽字符类型在处理多语言编程中的字符串以及特殊字符时非常有用,因为它可以支持更广泛的字符范围。
二、wchar_t的大小wchar_t类型占据的字节大小在不同平台和编译器中可以有所不同。
这是因为不同平台对wchar_t类型的实现方式可能会有所差异。
在大多数平台中,wchar_t 类型占据2个或4个字节的空间。
三、wchar_t类型的字面常量wchar_t类型的字面常量可以使用L前缀加上单引号或双引号来表示,例如L'X'或L"Hello, World!"。
这样做是为了告诉编译器这是一个宽字符的常量。
四、wchar_t类型的标准库函数wchar_t类型在C++标准库中定义了一系列用于处理宽字符字符串的函数。
这些函数以"w"开头,例如wprintf()、wscanf()、wcslen()等。
这些函数是对应于普通的char类型字符串函数的宽字符版本。
五、wchar_t类型的宽字符编码方式wchar_t类型在不同编译器和平台中可能使用不同的宽字符编码方式。
常见的宽字符编码方式有UTF16和UTF32。
UTF16是以16位无符号整数来表示每个字符,而UTF32是以32位无符号整数来表示每个字符。
这些编码方式使得wchar_t 类型可以表示更广泛的字符范围。
六、wchar_t类型的使用注意事项在使用wchar_t类型时,需要注意的是,它只能在支持宽字符的编译器和平台上使用。
wchar_t,char,string,wstring之间的相互转换

wchar_t,char,string,wstring之间的相互转换在处理中⽂时有时需要进⾏wchar_t,char,string,wstring之间的转换。
其中char和string之间、wchar_t和wstring之间的转换较为简单,代码在vs2010下测试通过。
复制代码代码如下:#include <iostream>#include <string>#include <tchar.h>#include <Windows.h>using namespace std;//Converting a WChar string to a Ansi stringchar *w2c(char *pcstr,const wchar_t *pwstr, size_t len){int nlength=wcslen(pwstr);//获取转换后的长度int nbytes = WideCharToMultiByte( 0, 0, pwstr, nlength, NULL,0,NULL, NULL );if(nbytes>len) nbytes=len;// 通过以上得到的结果,转换unicode 字符为ascii 字符WideCharToMultiByte( 0,0, pwstr, nlength, pcstr, nbytes, NULL, NULL );return pcstr ;}int main(){setlocale(LC_ALL,"chs");char* cc = "this is a char 测试";wchar_t* wcc = L"this is a wchar 测试";string str("this is a string 测试 ");wstring wstr = L"this is a wstring 测试";//string to charconst char* char_test = str.c_str();//cout<<"char_test:"<<char_test<<endl;//char to stringstring ss = cc;//cout<<"ss is :"<<ss<<endl;//wstring to wcharconst wchar_t* wchar_test = wstr.c_str();//wcout<<wchar_test<<endl;//wchar to wstringwstring wss = wcc;wcout<<wcc<<endl;//char to wchar_twchar_t *wc = new wchar_t[str.size()+1];//swprintf(wc,L"%S",cc);//wcout<<cc<<endl;delete []wc;// wchar_t to charchar *pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(wcc)+1));memset(pcstr , 0 , 2 * wcslen(wcc)+1 );w2c(pcstr,wcc,2 * wcslen(wcc)+1) ;free(pcstr);system("pause"); return 1;}。
C标准库中转换wchar_t和char类型的字符串

C标准库中转换wchar_t和char类型的字符串C 库函数 - mbstowcs()描述C 库函数 size_t mbstowcs(schar_t *pwcs, const char *str, size_t n) 把参数 str 所指向的多字节字符的字符串转换为参数 pwcs 所指向的数组。
声明下⾯是 mbstowcs() 函数的声明。
size_t mbstowcs(schar_t *pwcs, const char *str, size_t n)参数pwcs -- 指向⼀个 wchar_t 元素的数组,数组长度⾜以存储⼀个最⼤字符长度的宽字符串。
str -- 要被转换的多字节字符字符串。
n -- 要被转换的最⼤字符数。
返回值该函数返回转换的字符数,不包括结尾的空字符。
如果遇到⼀个⽆效的多字节字符,则返回 -1 值。
C 库函数 - wcstombs()描述C 库函数 size_t wcstombs(char *str, const wchar_t *pwcs, size_t n) 把宽字符字符串 pwcs 转换为⼀个 str 开始的多字节字符串。
最多会有 n 个字节被写⼊ str 中。
声明下⾯是 wcstombs() 函数的声明。
size_t wcstombs(char *str, const wchar_t *pwcs, size_t n)参数str -- 指向⼀个 char 元素的数组,⾄少有 n 字节长。
pwcs -- 要被转换的宽字符字符串。
n -- 要被写⼊到 str 中的最⼤字节数。
返回值该函数返回转换和写⼊到 str 中的字节数,不包括结尾的空字符。
如果遇到⼀个⽆效的多字节字符,则返回 -1 值。
TCHAR、wchar_t、char及字符串处理函数区别

一.ANSI和UNICODE
2.ANSI字符和Unicode字符
ANSI字符类型为CHAR,指向字符串的指针PSTR(LPSTR),指向一个常数字符串的指针PCSTR(LPCSTR);
对应的Windows定义的Unicode字符类型为WCHAR(typedef WCHAR wchar_t) ,指向Unicode字符串的指针PWSTR ,指向一个常数Unicode字符串的指针PCWSTR 。
2.通用字符串指针LPTSTR
LPTSTR
ifdef UNICODE it is LPWSTR(*wchar_t) for Unicode platforms;
else it is LPSTR (*char) for ANSI and DBCS platforms.
3.通用通用常数字符串指针LPCTSTR
LPCTSTR
ifdef UNICODE it is LPCWSTR(*const wchar_t) for Unicode platforms;
else it is LPCSTR (*const char)for ANSI and DBCS platforms.
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
USES_CONVERSION;
C++中宽字符类型(wchar_t)的编码

C++中宽字符类型(wchar_t)的编码转载⾃: /article/111027问题的起因是和⼀个朋友讨论不同编码的转换问题,说到了wchar_t的类型,朋友的看法是,wchar_t的编码⽅式是utf-16,长度⼀定是16位的。
我的看法不同,我认为wchar_t的长度和编码⽅式都是编译器和平台决定的,和语⾔没任何关系。
后来这个朋友为了说服我,回家把C++ Primer给我搬出来了,还给我截了个图(因为我没这本书),在这本书第30页有个表格,清楚地写着wchar_t是unicode字符,⽽最⼩尺⼨是16。
既然“最⼩尺⼨是16”了,那么其他尺⼨的可能性就有了,但是编码⽅式是怎么回事?因为凭我印象,貌似没有任何⽂档规定过宽字符的编码⽅式,我想说服我朋友,但脑⼦⾥有没有证据,不知道从何说起,因此回家仔细查了查资料,算是有了个了解。
1. 宽字符的编码⽅式到底是谁定的?这⾥有两个选择,要么是C++语⾔标准,要么是编译器作者设计的;若是前者,则编码⽅式就没有异议了,任何平台、任何编译器,都应该⼀样;但若是后者,这就完全取决于编译器制作者的想法了。
那么,C++中,到底是什么情况?我们可以翻阅下C++ ISO 2003的⽂档,在3.91章第五条,清楚地写着wchar_t的定义如下:Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest extended character set specified among the supported locales (22.1.1). Type wchar_t shall have the same size, signedness, and alignmentrequirements (3.9) as one of the other integral types, called its underlying type.从这段描述中可以得出⼏个结论:1. wchar_t是⽤来存储所有⽀持区域的字符的;2. wchar_t的底层存储⽅式是整形,本质上也就是个整形。
char转wchart及wchart转char

2009-07-2415:16:01|分类:VC++|字号订阅利用w idech artom ultib yte来转换的函数通常适合于wind ow平台上使用#inclu de <t char.h>#inclu de <w indow s.h>int_tmai n(int argc, _tc har*argv[]){wch ar_tpwstr[] =l"我是中国人";wchar_t pw str2[20];char*pcst r = (char*)mal loc(s izeof(char)*(2* wcs len(p wstr)+1)); mems et(pc str , 0 ,2 * w cslen(pwst r)+1); w2c(pcs tr,pw str,2 * wc slen(pwstr)+1); pri ntf("%s\n",pcst r);c2w(p wstr2,20,p cstr);wp rintf(l"%s",pws tr2); free(pcst r) ;retu rn 0;}//将wc har_t* 转成c har*的实现函数如下:c har *w2c(c har *pcstr,cons t wch ar_t*pwst r, si ze_tlen){i nt nl ength=wcsl en(pw str);//获取转换后的长度i nt nb ytes= Wid eChar ToMul tiByt e( 0, // s pecif y the code page used to p erfor m the conv ersio n0,// nospeci al fl ags t o han dle u nmapp ed ch aract erspwstr, // w ide c harac ter s tring to c onver tnl ength, // the numb er of wide char acter s inthatstrin gNU LL, // nooutpu t buf fer g iven, we j ust w ant t o kno w how long it n eedsto be0,NULL, //no re place mentchara ctergivenNUL L ); // we d on'twantto kn ow if a ch aract er di dn'tmakeit th rough thetrans latio n // make sure thebuffe r isbig e nough forthis, maki ng it larg er if nece ssaryif(nbyte s>len) n bytes=len;//通过以上得到的结果,转换uni code字符为as cii 字符Wi deCha rToMu ltiBy te( 0, //speci fy th e cod e pag e use d toperfo rm th e con versi on0, // no spec ial f lagsto ha ndleunmap ped c harac terspwst r, // wi de ch aract er st ringto co nvertnle ngth, // thenumbe r ofwidechara cters in t hat s tringpcs tr, // put theoutpu t asc ii ch aract ers a t the endof th e buf fernbyte s, // the re is at l eastthismuchspace ther eNU LL, // norepla cemen t cha racte r giv enN ULL );re turnpcstr ;}//将char*转成wc har_t*的实现函数如下://这是把asii字符转换为unico de字符,和上面相同的原理voidc2w(w char_t *pw str,s ize_t len,const char *str){if(s tr){ si ze_tnu =strle n(str);size_t n =(size_t)mu ltiby tetow idech ar(cp_acp,0,(co nst c har *)str,(int)nu,nu ll,0);i f(n>=len)n=len-1;multi bytet owide char(cp_ac p,0,(const char *)st r,(in t)nu,pwstr,(int)n);p wstr[n]=0; }}相关知识点:Unico de的出现是为了适应软件国际化的需要。
VC++中的char,wchar_t,

VC++中的char,wchar_t,1.VC++中的char,wchar_t,TCHAR大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI 函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱。
为了统一,有必要把来龙去脉搞清楚。
为了搞清这些函数,就必须理请几种字符类型的写法。
char就不用说了,先说一些wchar_t。
wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:typedef unsigned short wchar_t;不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t 字符串,必须使用wcs前缀的函数,例如wcscpy。
为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如:wchar_t *szT est=L"This is a Unicode string.";下面在看看TCHAR。
如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。
TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。
如果你使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode 的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。
另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。
以strcpy函数为例子,总结一下:.如果你想使用ANSI字符串,那么请使用这一套写法:char szString[100];strcpy(szString,"test");.如果你想使用Unicode字符串,那么请使用这一套:wchar_t szString[100];wcscpyszString,L"test");.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:TCHAR szString[100];_tcscpy(szString,_TEXT("test"));2.字符串及处理之三: 使用TCHAR系列方案使用TCHAR系列方案编写程序TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。
char与wchar_t之间的转换

char*与wchar_t*之间的转换1.问题描述char字符与wchar_t字符由于编码不同,所以在char*和wchar_t之间使用强制类型转换达不到正确转换字符串的目的。
考察如下程序。
#include<iostream>usingnamespace std;int main(){wchar_t* str=L"ABC我们";char* s=(char*)str;cout<<s<<endl;}输出结果出错:只输出A。
经过强制类型转换,s指向了宽字符编码字符串,字符串数据没有发生任何变化,只是用多字节字符字符编码重新对它进行解释,自然输出的结果是错误的。
2.char*与wchar_t*之间相互转换要想将宽字符编码字符串转换成多字节编码字符串(或者反过来),必须先读懂原来的字符串,然后再重新对它进行编码。
只有这样才能到达转换的目的。
由于宽字符可以表示多国语言的文字,因此,下文的讨论限于中文的宽字符串与多字节字符串之间的相互转换。
在不同的才做系统上,有一些特殊的库函数可以用来进行字符编码之间的转换。
在VC++中,其中关键的几个函数是setlocale()、wcstombs_s()和mbstowcs_s()。
2.1关键函数简介(1)setlocale()功能:配置地域化信息头文件:#include <locale.h>函数原型:char *setlocale (int category, const char * locale);函数参数:category表示对本地化的某项内容进行设置,可取如下值:LC_ALL 包括下面的全部选项都要;LC_COLLATE 配置字符串比较;C_CTYPE 配置字符类别及转换,例如全变大写strtoupper();LC_MONETARY 配置金融货币;LC_NUMERIC 配置小数点后的位数;LC_TIME 配置时间日期格式,与strftime() 合用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++标准中,wchar_t是宽字符类型,每个wchar_t类型占2个字节,16位宽。
汉字的表示就要用到wchar_t 。
char,我们都知道,占一个字节,8位宽。
其实知道了这个以后,要在wchar_t 和 char两种类型之间转换就不难实现了。
wchar_t 转换为char 的代码如下:
有如下的wchar_t和char变量
wchar_t w_cn = '中';
char c_cn[2] = {'0'} ;
char *C2W(wchar_t w_cn , char c_cn[2])
{
//following code convert wchar to char
c_cn[0] = w_cn >> 8 ;
c_cn[1] = w_cn ;
c_cn[2] = '\0';
return c_cn ;
}
其中需要注意的是一个16位的wchar_t需要用两个8位的char来存储之。
我们可以发现另外一个问题,wchar_t的高位字节应该存储在char 数组的低位字节。
(这里没有仔细研究了,觉得怪怪的)。
这是完成了wchar_t到char的转化,char到wchar_t的转换类似。
C++中,你要想这样:cout<<w_cn<<endl;打印wchar_t,那是不行的。
why?我想是wchar_t类型没有重载<<运算符吧。
要显示,我的方法是string cn(c_cn);
cout<<cn<<endl;
这样就能正确的打印wchar_t字符了。
是不是感觉好像做了好多事,但是完成的却是很简单的事情?呵呵,其实我也有同感,但是没有办法。
更简单的办法,当然是直接用API(我一个是懒的去找了,二一个自己动手转换有些东西看的更清楚咯),但是这样的转换更灵活,在实际中应该会用到的。
有了以上的基础,下面给出wchar_t字符串到char字符串的转换代码:char *W2C(const wchar_t *pw , char *pc)
{
//cout<<*pw<<endl; //这样是不能正确显示的,你可以试试看显示的是什么
*pc++ = *pw >> 8 ;
*pc = *pw ;
return 0 ;
}
char *wstr2cstr(const wchar_t *pwstr , char *pcstr, size_t len) {
char *ptemp = pcstr ;
if(pwstr!=NULL && pcstr!=NULL)
{
size_t wstr_len = wcslen(pwstr) ;
len = (len > wstr_len ) ? wstr_len : len ;
while( len -- > 0)
{
W2C(pwstr , pcstr);
pwstr++ ;
pcstr +=2 ; //和我们开始说的一样+2,不是+1
}
*pcstr = '\0';
return ptemp ;
}
return 0 ;
}
上面就是代码,测试:
int main(int arg , char *argv[])
{
wchar_t pwstr[] = {'我' , '是' , '中' , '国' , '人'}; char *pcstr = (char *)new char[2 * wcslen(pwstr)+1] ; memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );
wstr2cstr(pwstr , pcstr , wcslen(pwstr)) ;
str.assign (pcstr);
cout<<str<<endl;
delete []pcstr ;
}
CString转char
CString str( _T("学生=%d"),pDoc->i_CurStu.m_iStuNo);
LPTSTR lpsz =(LPTSTR)(LPCTSTR)str;
pDC->TextOutW(0,100,lpsz);
CString str2( _T("成绩=%d"),pDoc->i_CurStu.m_iScore);
LPTSTR lpsz2 =(LPTSTR)(LPCTSTR)str2;
pDC->TextOutW(0,100,lpsz2);
over!。