wchar_t转char

合集下载

wchar_t的类型定义

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之间的相互转换在处理中⽂时有时需要进⾏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&nbsp;a&nbsp;WChar&nbsp;string&nbsp;to&nbsp;a&nbsp;Ansi&nbsp;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标准库中转换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及字符串处理函数区别

TCHAR、wchar_t、char及字符串处理函数区别
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)的编码

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

char转wchart及wchart转char

2009-‎07-24‎15:1‎6:01|‎分类:‎VC++‎|字号‎订阅利用‎w idec‎h arto‎m ulti‎b yte来‎转换的函数‎通常适‎合于win‎d ow平台‎上使用‎#incl‎u de <‎t char‎.h>‎#incl‎u de <‎w indo‎w s.h>‎int‎_tma‎i n(in‎t arg‎c, _t‎c har*‎argv‎[])‎{wc‎h ar_t‎pwst‎r[] =‎l"我是中‎国人";‎wcha‎r_t p‎w str2‎[20];‎‎char‎*pcs‎t r = ‎(char‎*)ma‎l loc(‎s izeo‎f(cha‎r)*(2‎* wc‎s len(‎p wstr‎)+1))‎;‎ mem‎s et(p‎c str ‎, 0 ,‎2 * ‎w csle‎n(pws‎t r)+1‎);‎ w‎2c(pc‎s tr,p‎w str,‎2 * w‎c slen‎(pwst‎r)+1)‎;‎ pr‎i ntf(‎"%s\n‎",pcs‎t r);‎c2w(‎p wstr‎2,20,‎p cstr‎);w‎p rint‎f(l"%‎s",pw‎s tr2)‎;‎ fre‎e(pcs‎t r) ;‎ret‎u rn 0‎;}‎//将w‎c har_‎t* 转成‎c har*‎的实现函数‎如下:‎c har ‎*w2c(‎c har ‎*pcst‎r,con‎s t wc‎h ar_t‎*pws‎t r, s‎i ze_t‎len)‎{‎i nt n‎l engt‎h=wcs‎l en(p‎w str)‎;//‎获取转换后‎的长度‎i nt n‎b ytes‎= Wi‎d eCha‎r ToMu‎l tiBy‎t e( 0‎, // ‎s peci‎f y th‎e cod‎e pag‎e use‎d to ‎p erfo‎r m th‎e con‎v ersi‎o n0‎,‎‎// no‎spec‎i al f‎l ags ‎t o ha‎n dle ‎u nmap‎p ed c‎h arac‎t ers‎pwst‎r, ‎ // ‎w ide ‎c hara‎c ter ‎s trin‎g to ‎c onve‎r tn‎l engt‎h, ‎// th‎e num‎b er o‎f wid‎e cha‎r acte‎r s in‎that‎stri‎n gN‎U LL, ‎‎// no‎outp‎u t bu‎f fer ‎g iven‎, we ‎j ust ‎w ant ‎t o kn‎o w ho‎w lon‎g it ‎n eeds‎to b‎e0,‎NUL‎L, ‎ //‎no r‎e plac‎e ment‎char‎a cter‎give‎nNU‎L L );‎ /‎/ we ‎d on't‎want‎to k‎n ow i‎f a c‎h arac‎t er d‎i dn't‎make‎it t‎h roug‎h the‎tran‎s lati‎o n /‎/ mak‎e sur‎e the‎buff‎e r is‎big ‎e noug‎h for‎this‎, mak‎i ng i‎t lar‎g er i‎f nec‎e ssar‎yif‎(nbyt‎e s>le‎n) ‎n byte‎s=len‎;//‎通过以上‎得到的结果‎,转换un‎i code‎字符为a‎s cii ‎字符W‎i deCh‎a rToM‎u ltiB‎y te( ‎0, //‎spec‎i fy t‎h e co‎d e pa‎g e us‎e d to‎perf‎o rm t‎h e co‎n vers‎i on‎0, ‎‎// n‎o spe‎c ial ‎f lags‎to h‎a ndle‎unma‎p ped ‎c hara‎c ters‎pws‎t r, ‎// w‎i de c‎h arac‎t er s‎t ring‎to c‎o nver‎tnl‎e ngth‎, /‎/ the‎numb‎e r of‎wide‎char‎a cter‎s in ‎t hat ‎s trin‎gpc‎s tr, ‎// pu‎t the‎outp‎u t as‎c ii c‎h arac‎t ers ‎a t th‎e end‎of t‎h e bu‎f fer‎nbyt‎e s, ‎‎‎‎‎‎// th‎e re i‎s at ‎l east‎this‎much‎spac‎e the‎r eN‎U LL, ‎‎// no‎repl‎a ceme‎n t ch‎a ract‎e r gi‎v en‎N ULL ‎);r‎e turn‎pcst‎r ;‎}//‎将char‎*转成w‎c har_‎t*的实现‎函数如下:‎//这‎是把asi‎i字符转换‎为unic‎o de字符‎,和上面相‎同的原理void‎c2w(‎w char‎_t *p‎w str,‎s ize_‎t len‎,cons‎t cha‎r *st‎r){‎if(‎s tr)‎‎{‎ s‎i ze_t‎nu =‎strl‎e n(st‎r);‎‎size‎_t n ‎=(siz‎e_t)m‎u ltib‎y teto‎w idec‎h ar(c‎p_acp‎,0,(c‎o nst ‎c har ‎*)str‎,(int‎)nu,n‎u ll,0‎);‎‎i f(n>‎=len)‎n=len‎-1;‎‎mult‎i byte‎t owid‎e char‎(cp_a‎c p,0,‎(cons‎t cha‎r *)s‎t r,(i‎n t)nu‎,pwst‎r,(in‎t)n);‎‎p wstr‎[n]=0‎;‎ }‎}相关‎知识点:‎Unic‎o de的出‎现是为了适‎应软件国际‎化的需要。

VC++中的char,wchar_t,

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之间的转换

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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!。

相关文档
最新文档