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

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

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

2020-05-23 13:49: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就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频精品一区二区三区| 欧美在线视频一区| 亚洲男人7777| 日韩小视频在线观看| 亚洲精品一区中文| 国产97在线播放| 国产一区视频在线播放| 国产精品极品美女粉嫩高清在线| 91国偷自产一区二区三区的观看方式| 日韩亚洲欧美中文高清在线| 国产精品爱啪在线线免费观看| 日韩中文字幕av| 一区二区欧美日韩视频| 国产欧美亚洲视频| 亚洲欧美一区二区三区情侣bbw| 亚洲精品国产拍免费91在线| 国产精品日本精品| 久久亚洲国产成人| 欧美电影免费观看电视剧大全| 狠狠躁夜夜躁人人爽超碰91| 18性欧美xxxⅹ性满足| 日韩成人在线视频网站| 国产精品网红福利| 国产亚洲欧美日韩美女| 国产精品电影在线观看| 久久综合伊人77777尤物| 97在线免费观看视频| 欧美激情视频一区二区三区不卡| 国产一区二区激情| 国产一区二区三区在线免费观看| 亚洲新声在线观看| 亚洲午夜精品视频| 青青草原成人在线视频| 秋霞成人午夜鲁丝一区二区三区| 欧美久久精品午夜青青大伊人| 疯狂蹂躏欧美一区二区精品| 九九热这里只有精品6| 精品久久久91| 亚洲级视频在线观看免费1级| 在线视频亚洲欧美| 亚洲欧洲成视频免费观看| 亚洲精品美女久久久| 亚洲精品乱码久久久久久按摩观| 久久精品久久久久久| 欧美在线观看网站| 另类视频在线观看| 欧美专区中文字幕| 国模吧一区二区三区| 亚洲国产97在线精品一区| 日本亚洲欧洲色α| 久久成人这里只有精品| 国产精品视频男人的天堂| 在线中文字幕日韩| 日韩欧美成人免费视频| 欧美日韩国产丝袜美女| 久久琪琪电影院| 这里只有精品在线播放| 亚洲电影免费观看| 欧美激情第三页| 国产亚洲精品成人av久久ww| 韩国三级电影久久久久久| 国产精品香蕉在线观看| 欧美高清自拍一区| 国产成人福利夜色影视| 欧美丝袜第一区| 欧美与黑人午夜性猛交久久久| 日韩欧美国产中文字幕| 午夜精品久久久久久久男人的天堂| 亚洲精品福利在线观看| 上原亚衣av一区二区三区| 成人免费激情视频| 欧美另类极品videosbest最新版本| 日韩精品视频在线播放| 久久久久日韩精品久久久男男| 欧美激情女人20p| 伊人久久大香线蕉av一区二区| 精品久久久久久久久久久久| 国产精品99久久久久久久久| 国产91精品黑色丝袜高跟鞋| 日韩大陆欧美高清视频区| 国产精品一区二区女厕厕| 日韩男女性生活视频| 性色av一区二区三区红粉影视| 亚洲午夜未删减在线观看| 国产精品色视频| 久久久国产91| 亚洲va码欧洲m码| 欧美激情视频网址| 久久精品一本久久99精品| 性欧美在线看片a免费观看| 成人在线精品视频| 欧美在线免费视频| 成人黄色激情网| 国产精品久久久久久久久久久久| 久久网福利资源网站| 日av在线播放中文不卡| 日韩av影视综合网| 青草青草久热精品视频在线网站| 日韩大片免费观看视频播放| 最近2019年好看中文字幕视频| 亚洲精品白浆高清久久久久久| 黑人狂躁日本妞一区二区三区| 亚洲精品久久7777777| 国产日韩欧美电影在线观看| 日韩色av导航| 91在线免费网站| 亚洲乱码一区av黑人高潮| 欧美精品videosex牲欧美| 国产日韩在线精品av| 亚洲福利精品在线| 欧美精品激情blacked18| 91夜夜揉人人捏人人添红杏| 国语自产精品视频在免费| 91中文字幕一区| 欧美丰满少妇xxxxx| 久久精品免费电影| 日韩av片电影专区| 91久久夜色精品国产网站| 国产成人精品一区二区在线| 日韩精品www| 日韩av资源在线播放| 国产99在线|中文| 国产视频久久网| 亚洲国产99精品国自产| 国产女精品视频网站免费| 亚洲午夜未满十八勿入免费观看全集| 精品亚洲夜色av98在线观看| 成人免费黄色网| 欧美日韩国产专区| 亚洲成人精品视频在线观看| 久久亚洲精品中文字幕冲田杏梨| 国产日韩在线精品av| 国产自摸综合网| 国产69久久精品成人| 国产深夜精品福利| 一本色道久久88亚洲综合88| 亚洲激情视频网| 97精品一区二区视频在线观看| 亚州成人av在线| 国产精品久久久久av| 国产日韩欧美在线| 日av在线播放中文不卡| 亚洲自拍欧美另类| 91情侣偷在线精品国产| 国产日韩欧美日韩| 久久久国产在线视频| 日韩激情视频在线| 日本国产高清不卡| 秋霞av国产精品一区| 亚洲网址你懂得| 91久久久久久国产精品| 国产精品日日做人人爱| 国产成人午夜视频网址| 国产欧美欧洲在线观看| 色午夜这里只有精品| 中文字幕日韩欧美在线视频| 日韩视频免费看| 久久av资源网站| 日本精品免费观看| 亚洲激情视频网站| 欧美日韩国产精品一区二区不卡中文| 精品一区二区三区四区在线| 亚洲人成电影网站色xx| 欧美成在线观看|