亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

淺談c++ 字符類型總結區別wchar_t,char,WCHAR

2020-01-26 14:12:26
字體:
來源:轉載
供稿:網友

1、區別wchar_t,char,WCHAR

ANSI:即 char,可用字符串處理函數:strcat( ),strcpy( ), strlen( )等以str打頭的函數。

UNICODE:wchar_t是Unicode字符的數據類型,它實際定義在里:

typedef unsigned short wchar_t;

另外,在頭文件中有這樣的定義:typedef wchar_t WCHAR; 所以WCHAR實際就是wchar_t

wchar_t 可用字符串處理函數:wcscat(),wcscpy(),wcslen()等以wcs打頭的函數。為了讓編譯器識別Unicode字符串,必須以在前面加一個“L”,例如: wchar_t *szTest=L"This is a Unicode string.";

2、TCHAR

在C語言里面提供了 _UNICODE宏(有下劃線),在Windows里面提供了UNICODE宏(無下劃線),只要定了_UNICODE宏和UNICODE宏,系統就會自 動切換到UNICODE版本,否則,系統按照ANSI的方式進行編譯和運行。只定義了宏并不能實現自動的轉換,他還需要一系列的字符定義支持。

1. TCHAR

如果定義了UNICODE宏則TCHAR被定義為wchar_t。

typedef wchar_t TCHAR;

否則TCHAR被定義為char typedef char TCHAR;

2. LPTSTR

如果定義了UNICODE宏則LPTSTR被定義為LPWSTR。

typedef LPTSTR LPWSTR;

否則TCHAR被定義為char typedef LPTSTR LPSTR;

說明:在使用字符串常量的時候需要使用_TEXT(“MyStr”)或者_T("")來支持系統的自動轉換。

3、BSTR

BSTR是一個帶長度前綴的字符串,主要由操作系統來管理的,所以要用api.主要用來和VB打交道的(VB里的string就是指它)要操作它的API函數有很多.比如SysAllocString,SysFreeString等等.

vc里封裝它的類如_bstr_t,及ATL中的CComBSTR等.

一個 BSTR 由頭部和字符串組成,頭部包含了字符串的長度信息,字符串中可以包含嵌入的 null 值。

BSTR 是以指針的形式進行傳遞的。(指針是一個變量,包含另外一個變量的內存地址,而不是數據。) BSTR 是 Unicode 的,即每個字符需要兩個字節。 BSTR 通常以兩字節的 null 字符結束。 wstr是寬字符,以雙字節表示一個字符 bstr是為了與原先的basic字符兼容,它的最前面的4個字節為其長度,以'/0'結束.

4、更進一步的字符串以及其指針的類型定義 

由于Win32 API文檔的函數列表使用函數的常用名字(例如, "SetWindowText"),所有的字符串都是用TCHAR來定義的。(除了XP中引入的只適用于Unicode的API)。下面列出一些常用的typedefs,你可以在msdn中看到他們。

type Meaning in MBCS builds Meaning in Unicode builds
WCHAR wchar_t wchar_t
LPSTR char* char*
LPCSTR const char* const char*
LPWSTR wchar_t* wchar_t*
LPCWSTR wchar_t* wchar_t*
TCHAR TCHAR char wchar_t
LPTSTR TCHAR* TCHAR*
LPCTSTR const TCHAR* const TCHAR*

5、相互轉換

(1) char*轉換成CString

若將char*轉換成CString,除了直接賦值外,還可使用CString::Format進行。例如:

char chArray[] = "This is a test";
char * p = "This is a test";

LPSTR p = "This is a test";

或在已定義Unicode應的用程序中

TCHAR * p = _T("This is a test");

LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;

(2) CString轉換成char*

若將CString類轉換成char*(LPSTR)類型,常常使用下列三種方法:

方法一,使用強制轉換。

例如:

CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

方法二,使用strcpy。

例如:

CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);

需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數是 const wchar_t* (Unicode)或const char* (ANSI),系統編譯器將會自動對其進行轉換。

方法三,使用CString::GetBuffer。

例如:

CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在這里添加使用p的代碼
if(p != NULL) *p = _T('/0');
s.ReleaseBuffer();
// 使用完后及時釋放,以便能使用其它的CString成員函數

(3) BSTR轉換成char*

方法一,使用ConvertBSTRToString。

例如:

#include
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完釋放
delete[] lpszText2;
return 0;
}

方法二,使用_bstr_t的賦值運算符重載。

例如:

_bstr_t b = bstrText;
char* lpszText2 = b;

(4) char*轉換成BSTR

方法一,使用SysAllocString等API函數。

例如:

BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);

方法二,使用COleVariant或_variant_t。

例如:

//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;

方法三,使用_bstr_t,這是一種最簡單的方法。

例如:

BSTR bstrText = _bstr_t("This is a test");

方法四,使用CComBSTR。

例如:

BSTR bstrText = CComBSTR("This is a test");

CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;

方法五,使用ConvertStringToBSTR。

例如:

char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);

(5) CString轉換成BSTR

通常是通過使用CStringT::AllocSysString來實現。

例如:

CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完釋放

(6) BSTR轉換成CString

一般可按下列方法進行:

BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;

CStringA str(bstrText);

(7) ANSI、Unicode和寬字符之間的轉換

方法一,使用MultiByteToWideChar將ANSI字符轉換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉換成ANSI字符。

方法二,使用“_T”將ANSI轉換成“一般”類型字符串,使用“L”將ANSI轉換成Unicode,而在托管C++環境中還可使用S將ANSI字符串轉換成String*對象。例如:

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所示的統一形式:

其中,第一個C表示“類”,以便于ATL 3.0宏相區別,第二個C表示常量,2表示“to”,EX表示要開辟一定大小的緩沖。SourceType和DestinationType可以是A、 T、W和OLE,其含義分別是ANSI、Unicode、“一般”類型和OLE字符串。例如,CA2CT就是將ANSI轉換成一般類型的字符串常量。

下面 是一些示例代碼:

LPTSTR tstr= CA2TEX<16>("this is a test");LPCTSTR tcstr= CA2CT("this is a test");wchar_t wszStr[] = L"This is a test";char* chstr = CW2A(wszStr);

以上這篇淺談c++ 字符類型總結區別wchar_t,char,WCHAR就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品视频在线导航| 国产精品1区2区在线观看| 亚洲香蕉成人av网站在线观看| 国产精品美女在线观看| 亚洲精品一区二区三区不| 亚洲国产精品99久久| 国产精品美女免费看| 日韩在线免费视频观看| 在线看福利67194| 国产精品久久国产精品99gif| 日韩欧美aaa| 亚洲影院色在线观看免费| 欧美一级bbbbb性bbbb喷潮片| 日韩av在线一区二区| 91福利视频在线观看| 亚洲跨种族黑人xxx| 成人情趣片在线观看免费| 国产欧美婷婷中文| 成人福利在线视频| 91人人爽人人爽人人精88v| 欧美成人在线影院| 国产91色在线|| 亚洲欧美中文字幕在线一区| 91精品视频网站| 91香蕉亚洲精品| 在线观看日韩视频| 国产精品视频网站| 68精品国产免费久久久久久婷婷| 国产一区二区三区中文| 久久99青青精品免费观看| 成人免费网站在线看| 激情av一区二区| 久热精品在线视频| 亚洲一区二区三区四区在线播放| 日韩美女视频在线观看| 日韩av网址在线| 国产精品丝袜高跟| 91精品国产精品| www.日韩不卡电影av| 国产一区二区av| 91精品啪aⅴ在线观看国产| 国产精品99久久久久久久久| 欧洲亚洲妇女av| 国产精品免费观看在线| 国产精品久久综合av爱欲tv| 在线观看日韩av| 日韩国产在线播放| 日韩在线播放视频| 国产男人精品视频| 久久精品夜夜夜夜夜久久| 日韩激情视频在线| 亚洲一区第一页| 8090成年在线看片午夜| 欧美在线视频观看免费网站| 久久激情视频免费观看| 精品久久久久久久久久久久久久| 国产精品一区二区av影院萌芽| 亚洲黄页视频免费观看| 久热精品在线视频| 日韩av在线免费| 菠萝蜜影院一区二区免费| 日韩免费在线观看视频| 中文字幕九色91在线| 欧美色欧美亚洲高清在线视频| 亚洲黄在线观看| 亚洲男人天堂2023| 国内揄拍国内精品| 日韩久久免费电影| 26uuu亚洲国产精品| 亚洲第一视频在线观看| 亚洲午夜精品久久久久久久久久久久| 欧美美女操人视频| 91久久久久久久久| 91av在线影院| 538国产精品视频一区二区| 国产精品久久久久久久久借妻| 欧美激情久久久久久| 精品久久久久久久久国产字幕| 欧美在线视频网| 欧美激情网站在线观看| 国产精品视频一区二区高潮| 91在线精品播放| 色偷偷噜噜噜亚洲男人的天堂| 国产精品免费久久久久影院| 亚洲一区二区中文字幕| 成人激情视频在线播放| 久久久精品久久| 久久综合88中文色鬼| 日韩精品亚洲元码| 色阁综合伊人av| 亚洲国产精品推荐| 国产精品久久久| 色在人av网站天堂精品| 亚洲精品电影网| 日韩精品视频免费在线观看| 欧美成人亚洲成人| 亚洲网站在线观看| 国产精品入口日韩视频大尺度| 国产在线观看不卡| 久久久www成人免费精品张筱雨| 精品电影在线观看| 青青草精品毛片| 性欧美亚洲xxxx乳在线观看| 亚洲女人天堂成人av在线| 久久亚洲一区二区三区四区五区高| 成人看片人aa| 久久夜色精品国产亚洲aⅴ| 欧美性受xxxx白人性爽| 亚洲在线www| 久久人人97超碰精品888| 美女福利精品视频| 国产精品免费一区豆花| 日韩av大片免费看| 亚洲人成电影网站色www| 中文字幕亚洲字幕| 亚洲视频电影图片偷拍一区| 国产一区二区动漫| www欧美日韩| 久久免费国产视频| 国产欧美一区二区三区在线| 欧美午夜女人视频在线| 国产精品草莓在线免费观看| 亚洲欧美制服综合另类| 亚洲精品电影网| 成人免费自拍视频| 视频在线观看一区二区| 日韩视频在线观看免费| 亚洲精品视频在线观看视频| 丝袜美腿亚洲一区二区| 欧美日韩精品二区| 欧美综合一区第一页| 亚洲精品成a人在线观看| 亚洲成人av片在线观看| 国产精品网站大全| 亚洲精品永久免费| 日韩免费电影在线观看| 欧美电影院免费观看| 91啪国产在线| 日韩在线视频观看正片免费网站| 亚洲最大的免费| 欧美精品在线观看| 国产精品狼人色视频一区| 亚洲女同精品视频| 欧美成人免费在线观看| 国产一区二中文字幕在线看| 国产女人精品视频| 亚洲毛片在线观看| 亚洲图片欧美午夜| 国产精品网站视频| 国产精品久久久久999| 欧美精品videofree1080p| 久久久久久久国产精品| 欧美日韩免费看| 国内精品小视频在线观看| 日本免费一区二区三区视频观看| 日韩精品欧美激情| 国产一区二区免费| 亚洲第一精品久久忘忧草社区| 欧美精品在线免费| 亚洲国产精品成人精品| 亚洲免费视频观看| 欧美性猛交xxxx偷拍洗澡| 午夜欧美大片免费观看| 中文字幕v亚洲ⅴv天堂|