CString与WCHAR之间的转换(函数MultiByteToWideChar()详解)

合集下载

CString、TCHAR、char转换

CString、TCHAR、char转换

CString、TCHAR*、char*转换char*、TCHAR*转换CStringCString str(****)下面详细写一下其它转换///////////////////////////////**************************************************************** ********* 函数: TransCStringToTCHAR* 描述:将CString 转换为 TCHAR** 日期:*************************************************************** *********/TCHAR* CPublic::CString2TCHAR(CString &str){int iLen = str.GetLength();TCHAR* szRs = new TCHAR[iLen];lstrcpy(szRs, str.GetBuffer(iLen));str.ReleaseBuffer();return szRs;}/**************************************************************** ********* 函数: TCHAR2Char* 描述:将TCHAR* 转换为 char** 日期:*************************************************************** *********/char* TCHAR2char(TCHAR* tchStr){int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度char* chRtn = new char[iLen+1]wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值return chRtn;}/**************************************************************** ********* 函数: char2tchar* 描述:将 char* 转换为 TCHAR** 日期:*************************************************************** *********/TCHAR *char2tchar(char *str){int iLen = strlen(str);TCHAR *chRtn = new TCHAR[iLen+1];mbstowcs(chRtn, str, iLen+1);return chRtn;/**************************************************************** ********* 函数: CString2char* 描述:将CString转换为 char** 日期:*************************************************************** *********/char* CPublic::CString2char(CString &str){int len = str.GetLength();char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString 的长度中汉字算一个长度memset(chRtn, 0, 2*len+1);USES_CONVERSION;strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));return chRtn;}//参考/////////////////////////Pocket PC上的UNICODE和ANSI字符串//By Vassili Philippov, September 26, 2001.//杨方思歧译/////////////////////////**************************************************************** ********* 函数名:GetAnsiString* 描述:将CString(unicode)转换为char*(ANSI)* 参数:CString &s 要转换的CString* 返回值:返回转换结果* 创建日期:* 最后修改:*************************************************************** *********/char* GetAnsiString(const CString &s){int nSize = 2*s.GetLength();char *pAnsiString = new char[nSize+1];wcstombs(pAnsiString, s, nSize+1);return pAnsiString;}/////////////////////////////////////////////////////////////////// ///////////////////////////WideCharT oMultiByte和MultiByteT oWideChar函数的用法支持Unicode编码,需要多字节与宽字节之间的相互转换WideCharT oMultiByte的代码页用来标记与新转换的字符串相关的代码页。

CString与WCHAR之间的转换(函数MultiByteToWideChar()详解)

CString与WCHAR之间的转换(函数MultiByteToWideChar()详解)

把一个CString 类型的变量str转换成WCHAR类型的数组newStr的方法【在某些应用中会有用】CString str;WCHAR newStr[30];const char* tempStr=str;//tempStr相当于一个中间变量int length=strlen(tempStr)+1;//长度length,单位为字节int newLength=MultiByteToWideChar(CP_ACP,0, tempStr,length,NULL,0);//新长度newLength MultiByteToWideChar(CP_ACP,0, tempStr,length, newStr,newLength);注: 函数MultiByteToWideChar()的功能是将一个字符串转换成一个宽字符(unicode)的字符串.第1个参数指定执行转换的字符集,可以是下面任意值之一:CP_ACP:ANSI字符集CP_MACCP:Macintosh代码页CP_OEMCP:OEM代码页CP_SYMBOL:符号字符集CP_THREAD_ACP:当前线程ANSI代码页CP_UTF7:使用UTF-7转换CP_UTF8:使用UTF-8转换第2个参数:一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符.MB_PRECOMPOSED:通常使用预作字符.由一个基本字符和一个非空字符组成的字符只有一个单一的字符值.这是系统默认的转换选择.不能与MB_COMPOSITE值一起使用.MB_COMPOSITE:通常使用组合字符.由一个基本字符和一个非空字符组成的字符分别有不同的字符值.不能与MB_PRECOMPOSED值一起使用.MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastError返回ERROR_NO_UNICODE_TRANSLATION值.MB_USEGLYPHCHARS:使用象形文字替代控制字符第3个参数:指向将被转换字符串的字符第4个参数:第3个参数指向的字符串的字节数,即长度第5个参数: 指向接收被转换字符串的内存缓冲区第6个参数: 第5个参数指向的内存缓冲区的字节数。

MultiByteToWideChar和WideCharToMultiByte用法详解

MultiByteToWideChar和WideCharToMultiByte用法详解

MultiByteToWideChar和WideCharToMultiByte用法详解注意:这两个函数是由Windows提供的转换函数,不具有通用性C语言提供的转换函数为mbstowcs()/wcstombs()一、函数简单介绍涉及到的头文件:函数所在头文件:windows.h#include <windows.h>wchar_t类型所需头文件:wchar.h#include <wchar.h>( 1 ) MultiByteToWideChar()函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。

由该函数映射的字符串没必要是多字节字符组。

函数原型:int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cchMultiByte,LPWSTR lpWideCharStr,int cchWideChar);参数:1> CodePage:指定执行转换的多字节字符所使用的字符集这个参数可以为系统已安装或有效的任何字符集所给定的值。

你也可以指定其为下面的任意一值:2> dwFlags:一组位标记,用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。

你可以指定下面是标记常量的组合,含义如下:MB_PRECOMPOSED:通常使用预作字符——就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。

这是缺省的转换选择。

不能与MB_COMPOSITE值一起使用。

MB_COMPOSITE:通常使用组合字符——就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。

不能与MB_PRECOMPOSED值一起使用。

MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION 值。

几种C++std::string和std::wstring相互转换的转换方法(转)

几种C++std::string和std::wstring相互转换的转换方法(转)

⼏种C++std::string和std::wstring相互转换的转换⽅法(转)⼏种C++ std::string和std::wstring相互转换的转换⽅法第⼀种⽅法:调⽤WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核⼼编程》):#include <string>#include <windows.h>using namespace std;//Converting a WChar string to a Ansi stringstd::string WChar2Ansi(LPCWSTR pwszSrc){int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);if (nLen<= 0) return std::string("");char* pszDst = new char[nLen];if (NULL == pszDst) return std::string("");WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);pszDst[nLen -1] = 0;std::string strTemp(pszDst);delete [] pszDst;return strTemp;}string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); }//Converting a Ansi string to WChar stringstd::wstring Ansi2WChar(LPCSTR pszSrc, int nLen){int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);if(nSize <= 0) return NULL;WCHAR *pwszDst = new WCHAR[nSize+1];if( NULL == pwszDst) return NULL;MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);pwszDst[nSize] = 0;if( pwszDst[0] == 0xFEFF) // skip Oxfefffor(int i = 0; i < nSize; i ++)pwszDst[i] = pwszDst[i+1];wstring wcharString(pwszDst);delete pwszDst;return wcharString;}std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}第⼆种⽅法:采⽤ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下⾯代码可以在VS2005通过,⽆移植性);#include <string>#include <comutil.h>using namespace std;#pragma comment(lib, "comsuppw.lib")string ws2s(const wstring& ws);wstring s2ws(const string& s);string ws2s(const wstring& ws){_bstr_t t = ws.c_str();char* pchar = (char*)t;string result = pchar;return result;}wstring s2ws(const string& s){_bstr_t t = s.c_str();wchar_t* pwchar = (wchar_t*)t;wstring result = pwchar;return result;}第三种⽅法:使⽤CRT库的mbstowcs()函数和wcstombs()函数,平台⽆关,需设定locale。

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() 合用。

c++中wstring和string的转换

c++中wstring和string的转换

c++中wstring和string的转换⼀、wchar_t和char的基础知识1.C程序中使⽤的char类型,是占⽤⼀个字节,⼀共可以表⽰256个字符。

⽽在32位系统中,char*是占⽤四个字节的,因为⼀个指针变量占⽤的存储空间为4个字节。

char类型的编码规则⼀般为ASCII编码。

我在此处测试了⼀下再GCC中char[]是不可以存储中⽂字符的(可能是我的编译器没有和编辑器的编码⽅式不⼀样,导致出来的结果是乱码的中⽂),但是在vs中,似乎使⽤某些优化,char是可以⽤来存储中⽂字符的。

但是他们都是显⽰出⽂字来的,ASCII编码中没有汉字,但是还是显⽰出来了,这本⾝存在⼀些我们不知道的操作(这个内容需要⾃⼰来深究)。

在尝试了修改了编码问题后,GCC编译器也可以实现中⽂的输⼊了。

(待续)此时,对于这个问题我已经找到了我的答案普通的char类型是⼀个正数,是从0-127个编码,⽽输⼊中⽂的字符的值第⼀个字节都是负数(很难受,好像还是不对),可能是通过数字的符号来判定改符号是⼀个字节还是两个字节的。

因此判定char的编码规则应该不只是Ascii⼀种。

2.wchar_t在C程序中占⽤的字节为2个字节,相当于⼀个⽆符号短整型。

其长度是可变的,根据运⾏的平台⽽定,可以是2个字节或者是4个字节。

在win32 MSVC环境下,C库中wchar_t的长度为2个字节typedefine unsigned short wchar_t;/* 16bits*/wchar_t采⽤的是unicode编码,unicode的编码是固定的,但是因为其需要2到4个字节,它的存储⽅法不尽相同。

所以会产⽣不同版本的unicode。

unicode 的⼀种实现⽅式 UTF-8。

参见链接https:///kingstarspe/p/ASCII.htmlUTF-8的编码规则很简单,只有⼆条:1)对于单字节的符号,字节的第⼀位设为0,后⾯7位为这个符号的unicode码。

多字节与宽字节stringwstring互转

多字节与宽字节stringwstring互转

多字节与宽字节stringwstring互转多字节字符集(MBCS,Multi-Byte Chactacter Set):指⽤多个字节来表⽰⼀个字符的字符编码集合。

⼀般英⽂字母⽤1Byte,汉语等⽤2Byte来表⽰。

兼容ASCII 127。

在最初的时候,Internet上只有⼀种字符集——ANSI的ASCII字符集,它使⽤7 bits来表⽰⼀个字符,总共表⽰128个字符,其中包括了英⽂字母、数字、标点符号等常⽤字符。

为了扩充,以⽤于显⽰本国的语⾔,不同的国家和地区制定了不同的标准,由此产⽣了 GB2312, BIG5, JIS 等各⾃的编码标准。

这些使⽤ 2个来代表⼀个字符的各种汉字延伸编码⽅式,称为 ANSI 编码,⼜称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)"。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,⽆法将属于两种语⾔的⽂字,存储在同⼀段 ANSI 编码的⽂本中。

⼀个很⼤的缺点是,同⼀个编码值,在不同的编码体系⾥代表着不同的字。

这样就容易造成混乱。

导致了unicode码的诞⽣。

宽字节字符集:⼀般指Unicode编码的字符集,Unicode称为统⼀码或万国码,统⼀了不同国家的字符编码。

Unicode通常⽤两个字节表⽰⼀个字符,原有的英⽂编码从单字节变成双字节,只需要把⾼字节全部填为0就可以。

为了统⼀所有⽂字的编码,Unicode应运⽽⽣。

Unicode把所有语⾔都统⼀到⼀套编码⾥,这样就不会再有乱码问题了。

Unicode固然统⼀了编码⽅式,但是它的效率不⾼,⽐如UCS-4(Unicode的标准之⼀)规定⽤4个字节存储⼀个符号,那么每个英⽂字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。

为了提⾼Unicode的编码效率,于是就出现了UTF-8编码。

UTF-8可以根据不同的符号⾃动选择编码的长短。

⽐如英⽂字母可以只⽤1个字节就够了。

Char与CString的转换

Char与CString的转换
_tcscpy(lpsz, theString);
需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。
方法三,使用CString::GetBuffer。例如:
(5) CString转换成BSTR
通常是通过使用CStringT::AllocSysString来实现。例如:
CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完释放

CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
方法五,使用ConvertStringToBSTR。例如:
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
方法三,使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

把一个CString 类型的变量str转换成WCHAR类型的数组newStr的方法
【在某些应用中会有用】
CString str;
WCHAR newStr[30];
const char* tempStr=str;//tempStr相当于一个中间变量
int length=strlen(tempStr)+1;//长度length,单位为字节
int newLength=MultiByteToWideChar(CP_ACP,0, tempStr,length,NULL,0);//新长度newLength MultiByteToWideChar(CP_ACP,0, tempStr,length, newStr,newLength);
注: 函数MultiByteToWideChar()的功能是将一个字符串转换成一个宽字符(unicode)的字符串.
第1个参数指定执行转换的字符集,可以是下面任意值之一:
CP_ACP:ANSI字符集
CP_MACCP:Macintosh代码页
CP_OEMCP:OEM代码页
CP_SYMBOL:符号字符集
CP_THREAD_ACP:当前线程ANSI代码页
CP_UTF7:使用UTF-7转换
CP_UTF8:使用UTF-8转换
第2个参数:一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符.
MB_PRECOMPOSED:通常使用预作字符.由一个基本字符和一个非空字符组成的字符只有一个单一的字符值.这是系统默认的转换选择.不能与MB_COMPOSITE值一起使用.
MB_COMPOSITE:通常使用组合字符.由一个基本字符和一个非空字符组成的字符分别有不同的字符值.不能与MB_PRECOMPOSED值一起使用.
MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastError返回ERROR_NO_UNICODE_TRANSLATION值.
MB_USEGLYPHCHARS:使用象形文字替代控制字符
第3个参数:指向将被转换字符串的字符
第4个参数:第3个参数指向的字符串的字节数,即长度
第5个参数: 指向接收被转换字符串的内存缓冲区
第6个参数: 第5个参数指向的内存缓冲区的字节数。

相关文档
最新文档