麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

windows 字符

2019-11-11 06:05:16
字體:
供稿:網(wǎng)友

在windwos中的字符串可分為7-bit的 ASCII標(biāo)準(zhǔn) , 8-bit ANSI標(biāo)準(zhǔn)和 16-bit Unicode標(biāo)準(zhǔn)。而windows NT 是原生支持Unicode的。所以任何別的標(biāo)準(zhǔn)使用,系統(tǒng)都會(huì)把它轉(zhuǎn)換成Unicode。但是著不代表為了效率而只使用Unicode。因?yàn)閁nicode是使用2 byte來存儲(chǔ)字符的,所以它比單字節(jié)字符集或則多字節(jié)字符集要費(fèi)內(nèi)存空間。

CRT中字符管理

CRT中ANSI C標(biāo)準(zhǔn)部分兩個(gè)字符類型charwchar_t char :用雙引號(hào)括起來的常量,如“general”表示其中每一字符為char型(8位)。這些字符串可以用string.h頭文件下的函數(shù)處理。如的strlen()

wchar_t:用雙引號(hào)括起來的前綴加上 L 的常量,如L”wide character”,表示其中每一字符為wchar_t型(一般為16位)。這些字符串用wchar.h頭文件中函數(shù)處理 。如wcslen()

在CRT中非ANSI C標(biāo)準(zhǔn)部分有一個(gè) tchar.h頭文件 該表頭文件不是ANSI C標(biāo)準(zhǔn)的一部分,因此那里定義的每個(gè)函數(shù)和宏定義的前面都有一條底線。tchar.h為需要字符串參數(shù)的標(biāo)準(zhǔn)執(zhí)行時(shí)期鏈接庫函數(shù)提供了一系列的替代名稱(例如,_tPRintf和_tcslen)。有時(shí)這些名稱也稱為「通用」函數(shù)名稱,因?yàn)樗鼈兗瓤梢灾赶蚝瘮?shù)的Unicode版也可以指向非Unicode版。

如果用預(yù)編譯指令定義了_UNICODE的標(biāo)識(shí)符并且程序中包含了tchar.h表頭文件,那么_tcslen就定義為wcslen

#define _tcslen wcslen 如果沒有定義_UNICODE,則_tcslen定義為strlen: #define _tcslen strlen

tchar.h還用一個(gè)新的數(shù)據(jù)型態(tài)TCHAR來解決兩種字符數(shù)據(jù)型態(tài)的問題。如果定義了_UNICODE標(biāo)識(shí)符,那么TCHAR就是wchar_t: typedef wchar_t TCHAR ; 否則,TCHAR就是char: typedef char TCHAR ;

如果定義了_UNICODE標(biāo)識(shí)符,那么一個(gè)稱作__T的宏就定義如下 #define __T(x) L##x 那一對井字號(hào)稱為「粘貼符號(hào)(token paste)」,它將字母L添加到宏參數(shù)上。因此,如果宏參數(shù)是”Hello!”,則L##x就是L”Hello!”。

如果沒有定義_UNICODE標(biāo)識(shí)符,則__T宏只簡單地定義如下: #define __T(x) x 此外,還有兩個(gè)宏與__T定義相同:

#define _T(x)__T(x) #define _TEXT(x)__T(x)

Tips: 上述名稱中 t代表tchar的意思

同樣的 tchar.h頭文件中還有一個(gè)宏_MBCS負(fù)責(zé)把t開頭的函數(shù)(宏)轉(zhuǎn)換為處理多字節(jié)字符集的函數(shù)

圖片來自微軟

windwos中的字符管理

windwos中你可以像c/c++標(biāo)準(zhǔn)中一樣處理字符串。但是也可以使用獨(dú)特的windows 單一編碼原則。只需要讓W(xué)indows程序包括表頭文件windows.h。該文件包括許多其它表頭文件,包括windef.h,該文件中有許多在Windows中使用的基本型態(tài)定義,而且它本身也包括winnt.h。winnt.h處理基本的Unicode支持。

winnt的前面包含C的表頭文件ctype.h,這是C/C++的眾多表頭文件之一,包括wchar_t的定義。winnt.h定義了新的數(shù)據(jù)型態(tài),稱作CHARWCHAR: typedef char CHAR ; typedef wchar_t WCHAR ; // wc WCHAR定義后面的注釋是匈牙利標(biāo)記法的建議:一個(gè)基于WCHAR數(shù)據(jù)型態(tài)的變量可在前面附加上字母wc以說明一個(gè)寬字符。 winnt.h表頭文件進(jìn)而定義了可用做8位字符串指針的六種數(shù)據(jù)型態(tài)和四個(gè)可用做const 8位字符串指針的數(shù)據(jù)型態(tài)。這里精選了表頭文件中一些實(shí)用的說明數(shù)據(jù)型態(tài)語句:

typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ; typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;

Tips:

前綴N和L表示「near」和「long」,指的是16位Windows中兩種大小不同的指標(biāo)。在Win32中near和long指標(biāo)沒有區(qū)別。其中cch為 const char 的意思

類似地,WINNT.H定義了六種可作為16位字符串指針的數(shù)據(jù)型態(tài)和四種可作為const 16位字符串指針的數(shù)據(jù)型態(tài):

typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NwpsTR, * LPWSTR, * PWSTR ; typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;

Tips: c++中有如下宏

#define CONST const

與tchar.h一樣,winnt.h將TCHAR定義為一般的字符類型。如果定義了標(biāo)識(shí)符UNICODE(沒有底線),則TCHAR和指向TCHAR的指針就分別定義為WCHAR和指向WCHAR的指標(biāo);如果沒有定義標(biāo)識(shí)符UNICODE,則TCHAR和指向TCHAR的指針就分別定義為char和指向char的指標(biāo):

#ifdef UNICODE typedef WCHAR TCHAR, * PTCHAR ;typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ; typedef LPCWSTR LPCTSTR ; #elsetypedef char TCHAR, * PTCHAR ; typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ; typedef LPCSTR LPCTSTR ; #endif

如果已經(jīng)在某個(gè)表頭文件或者其它表頭文件中定義了TCHAR數(shù)據(jù)型態(tài),那么WINNT.H和WCHAR.H表頭文件都能防止其重復(fù)定義。不過,無論何時(shí)在程序中使用其它表頭文件時(shí),都應(yīng)在所有其它表頭文件之前包含WINDOWS.H。

winnt.h表頭文件還定義了一個(gè)宏,該宏將L添加到字符串的第一個(gè)引號(hào)前。如果定義了UNICODE標(biāo)識(shí)符,則一個(gè)稱作 __TEXT的宏定義如下: #define __TEXT(quote) L##quote 如果沒有定義標(biāo)識(shí)符UNICODE,則像這樣定義__TEXT宏: #define __TEXT(quote) quote 此外, TEXT宏可這樣定義: #define TEXT(quote) __TEXT(quote) 這與tchar.h中定義_TEXT宏的方法一樣,只是不必操心底線。

Windows函數(shù)呼叫

win32 的鏈接庫文件一般以32結(jié)尾,如USER32.DLL,而鏈接庫中字符處理方面的函數(shù)都有兩個(gè)版本(char 類型的和寬字符類型)。如MessageBox就有兩個(gè)版本。幸運(yùn)的是,您通常不必關(guān)心這個(gè)問題,程序中只需使用MessageBox即可。 當(dāng)使用動(dòng)態(tài)連接來編寫windows 程序時(shí),所謂函數(shù)“調(diào)用”實(shí)際會(huì)調(diào)用user32.dll中真正的函數(shù)。這就是所謂的動(dòng)態(tài)連接 而user32.dll是由兩個(gè)函數(shù)入口的,一個(gè)是char型的一個(gè)是寬字符類型的通過一系列類似tcahr.h中的宏定義最終會(huì)自動(dòng)選擇調(diào)用哪個(gè)函數(shù)。 MessageBox函數(shù)定義如下: int WINAPI MessageBox (HWND, LPCSTR, LPCSTR, UINT) ; 函數(shù)的第二個(gè)、第三個(gè)參數(shù)是指向常數(shù)字符串的指針。而WINAPI它指定了一個(gè)呼叫約定,包括如何生產(chǎn)機(jī)械碼以在堆棧中放置函數(shù)呼叫的參數(shù)。許多Windows函數(shù)呼叫聲明為WINAPI。 下面是MessageBoxA在WINUSER.H中定義的方法。這與MessageBox早期的定義很相似:

WINUSERAPI int WINAPI MessageBoxA (HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) ;

下面是MessageBoxW:

WINUSERAPI int WINAPI MessageBoxW (HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) ;

在WINUSER.H中定義的相關(guān)宏

#ifdef UNICODE#define MessageBox MessageBoxW#else#define MessageBox MessageBoxA#endif

Note: windwos 基本所有能自動(dòng)識(shí)別char和寬字符的函數(shù),底層都是通過上面的宏定義實(shí)現(xiàn)的。后綴A 表示的ASCII版本 ,也就是byte類型的。后綴W表示的是wide character 版本,也就是wchar_t。

windows 中的字符串處理

windows 中字符處理的函數(shù)非常多,從所屬版塊我們可以大致分為三種。 - CRT,其中的很多函數(shù)只能處理char 或者寬字符字符串。且存在安全隱患。下面會(huì)詳細(xì)介紹 - winows 同一編碼維護(hù)的版本,這些能自動(dòng)選擇處理char還是寬字符字符串。也存在安全隱患 - windows 安全版。這些能自動(dòng)選擇處理char還是寬字符字符串。且不存在安全隱患

此圖片來自微軟官網(wǎng)

例如strlen 返回的是char(byte)的個(gè)數(shù)。而lstrlen會(huì)根據(jù)TCHAR具體的類型選擇返回char長度還是寬字符個(gè)數(shù)。StringCchLength 也會(huì)根據(jù)TCHAR具體類型來返回char還是寬字符個(gè)數(shù),但是這個(gè)函數(shù)會(huì)防止緩沖區(qū)溢出,而StringCbLength返回的是字符串中有多少個(gè)byte(1 char==1 byte,1 wchar_t==2 byte),同樣這個(gè)函數(shù)一會(huì)防止緩沖區(qū)溢出。

而在CRT中字符處理方面的函數(shù)遠(yuǎn)不止上面那些。我也可以把它進(jìn)行以下分類

c/c++標(biāo)準(zhǔn)中規(guī)定的函數(shù)。這些函數(shù)分為char 和寬字符版本。如strcat, wcscat, 非標(biāo)準(zhǔn)函數(shù),以 _ 開頭 如_mbscat,又可以分為下面幾種 處理多字節(jié)字符集的函數(shù)。以_mbcs自動(dòng)識(shí)別字符類型的函數(shù),以_t開頭,t表示TCHAR的意思。但是這些函數(shù)存在安全隱患。如_tprintf,_tcslen自動(dòng)識(shí)別字符類型的函數(shù),且不存在安全隱患的函數(shù)。以_s結(jié)尾, s表示secure, 如fprintf_s、_fprintf_s_l、fwprintf_s、_fwprintf_s_l

Tips: 詳細(xì)的字符處理函數(shù)用法情參考msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ff468909(v=vs.85).aspx

windows 格式化字符串

c標(biāo)準(zhǔn)中的printf(); int printf (const char * szFormat, …) ;· 而windows 中使用sprintf() int sprintf (char * szBuffer, const char * szFormat, …) ;

第一個(gè)參數(shù)是字符緩沖區(qū);后面是一個(gè)格式字符串。Sprintf不是將格式化結(jié)果標(biāo)準(zhǔn)輸出,而是將其存入szBuffer。該函數(shù)返回該字符串的長度。在文字模式程序設(shè)計(jì)中 printf (“The sum of %i and %i is %i”, 5, 3, 5+3) ; 的功能相同于 char szBuffer [100] ;

sprintf (szBuffer, “The sum of %i and %i is %i”, 5, 3, 5+3) ;

puts (szBuffer) ;

在Windows中,使用MessageBox顯示結(jié)果優(yōu)于puts。

幾乎每個(gè)人都經(jīng)歷過,當(dāng)格式字符串與被格式化的變量不合時(shí),可能使printf執(zhí)行錯(cuò)誤并可能造成程序當(dāng)?shù)簟J褂胹printf時(shí),您不但要擔(dān)心這些,而且還有一個(gè)新的負(fù)擔(dān):您定義的字符串緩沖區(qū)必須足夠大以存放結(jié)果。Microsoft專用函數(shù)_snprintf解決了這一問題,此函數(shù)引進(jìn)了另一個(gè)參數(shù),表示以字符計(jì)算的緩沖區(qū)大小。

vsprintf是sprintf的一個(gè)變形,它只有三個(gè)參數(shù)。vsprintf用于執(zhí)行有多個(gè)參數(shù)的自訂函數(shù),類似printf格式。vsprintf的前兩個(gè)參數(shù)與sprintf相同:一個(gè)用于保存結(jié)果的字符緩沖區(qū)和一個(gè)格式字符串。第三個(gè)參數(shù)是指向格式化參數(shù)數(shù)組的指針。實(shí)際上,該指針指向在堆棧中供函數(shù)呼叫的變量。va_list、va_start和va_end宏(在STDARG.H中定義)幫助我們處理堆棧指針。本章最后的SCRNSIZE程序展示了使用這些宏的方法。使用vsprintf函數(shù),sprintf函數(shù)可以這樣編寫:

int sprintf (char * szBuffer, const char * szFormat, …)

{

int iReturn ;va_list pArgs ;va_start (pArgs, szFormat) ;iReturn = vsprintf (szBuffer, szFormat, pArgs) ;va_end (pArgs) ;return iReturn ;

}

va_start宏將pArg設(shè)置為指向一個(gè)堆棧變量,該變量地址在堆棧參數(shù)szFormat的上面。

由于許多Windows早期程序使用了sprintf和vsprintf,最終導(dǎo)致Microsoft向Windows API中增添了兩個(gè)相似的函數(shù)。Windows的wsprintf和wvsprintf函數(shù)在功能上與sprintf和vsprintf相同,但它們不能處理浮點(diǎn)格式。

當(dāng)然,隨著寬字符的發(fā)表,sprintf類型的函數(shù)增加許多,使得函數(shù)名稱變得極為混亂。表2-1列出了Microsoft的C執(zhí)行時(shí)期鏈接庫和Windows支持的所有sprintf函數(shù)。

ASCII 寬字符 常規(guī)
參數(shù)的變數(shù)個(gè)數(shù)
標(biāo)準(zhǔn)版 sprintf swprintf _stprintf
最大長度版 _snprintf _snwprintf _sntprintf
windows版 wsprintfA wsprintfW wsprintf
參數(shù)數(shù)組的指針
標(biāo)準(zhǔn)版 vsprintf vswprintf vstprintf
最大長度版 _vsnprintf _vsnwprintf _vsntprintf
windwos版 wvsprintfA wvsprintfW wvsprintf

Tips: 詳細(xì)的字符處理函數(shù)用法情參考msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ff468909(v=vs.85).aspx

【參考】 winodws 程序設(shè)計(jì) 第五版

C/C++ Language and Standard Libraries https://msdn.microsoft.com/en-us/library/hh875057.aspx

Strings https://msdn.microsoft.com/en-us/library/windows/desktop/ms646979(v=vs.85).aspx

CRT Alphabetical Function Reference https://msdn.microsoft.com/en-us/library/634ca0c2.aspx

Tchar.h 中的一般文本映射 https://msdn.microsoft.com/zh-cn/library/c426s321.aspx

About Strings https://msdn.microsoft.com/en-us/library/windows/desktop/ms647465(v=vs.85).aspx

Unicode in Visual C++ 2 https://msdn.microsoft.com/en-us/library/cc194799.aspx

fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l https://msdn.microsoft.com/en-us/library/ksf1fzyy.aspx

通用 Windows 平臺(tái)應(yīng)用中不支持的 CRT 函數(shù) https://msdn.microsoft.com/library/windows/apps/jj606124.aspx

[轉(zhuǎn)]C++ Unicode SBCS 函數(shù)對照表 http://www.cnblogs.com/PiaoDbg/archive/2012/03/04/2379336.html


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲欧美日韩免费 | 国av在线| 欧美大穴 | 中文字幕涩涩久久乱小说 | 最新中文字幕在线视频 | 欧美精品一区二区久久 | 一级毛片手机在线观看 | 国产资源在线免费观看 | 成人综合在线观看 | 免费专区 - 91爱爱 | 免费视频www在线观看 | 99国产精品欲a| 少妇一级淫片免费放播放 | 蜜桃网站在线 | 毛片在线视频观看 | 怦然心动50免费完整版 | 国产1区2区在线 | 在线播放一级片 | 免费国产视频在线观看 | 国产国语毛片 | 国产88久久久国产精品免费二区 | 日韩毛片免费观看 | 羞羞视频.www在线观看 | 久久视讯 | 亚洲自拍第一 | 欧美精品一区二区久久 | 国产精品啪 | 日本一道aⅴ不卡免费播放 视屏一区 | 伦一区二区三区中文字幕v亚洲 | 美女视频黄视大全视频免费网址 | 成年免费看 | 日韩高清电影 | 久久另类视频 | 日本黄色免费片 | 特级黄色一级毛片 | 亚洲一区二区国产 | 亚洲最大中文字幕 | 国产一区二区三区视频在线观看 | 成人毛片100部免费观看 | 美女黄影院 | 牛牛视频在线 |