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

首頁 > 學院 > 開發設計 > 正文

windows 字符

2019-11-11 06:42:09
字體:
來源:轉載
供稿:網友

在windwos中的字符串可分為7-bit的 ASCII標準 , 8-bit ANSI標準和 16-bit Unicode標準。而windows NT 是原生支持Unicode的。所以任何別的標準使用,系統都會把它轉換成Unicode。但是著不代表為了效率而只使用Unicode。因為Unicode是使用2 byte來存儲字符的,所以它比單字節字符集或則多字節字符集要費內存空間。

CRT中字符管理

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

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

在CRT中非ANSI C標準部分有一個 tchar.h頭文件 該表頭文件不是ANSI C標準的一部分,因此那里定義的每個函數和宏定義的前面都有一條底線。tchar.h為需要字符串參數的標準執行時期鏈接庫函數提供了一系列的替代名稱(例如,_tPRintf和_tcslen)。有時這些名稱也稱為「通用」函數名稱,因為它們既可以指向函數的Unicode版也可以指向非Unicode版。

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

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

tchar.h還用一個新的數據型態TCHAR來解決兩種字符數據型態的問題。如果定義了_UNICODE標識符,那么TCHAR就是wchar_t: typedef wchar_t TCHAR ; 否則,TCHAR就是char: typedef char TCHAR ;

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

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

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

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

同樣的 tchar.h頭文件中還有一個宏_MBCS負責把t開頭的函數(宏)轉換為處理多字節字符集的函數

圖片來自微軟

windwos中的字符管理

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

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

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

Tips:

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

類似地,WINNT.H定義了六種可作為16位字符串指針的數據型態和四種可作為const 16位字符串指針的數據型態:

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定義為一般的字符類型。如果定義了標識符UNICODE(沒有底線),則TCHAR和指向TCHAR的指針就分別定義為WCHAR和指向WCHAR的指標;如果沒有定義標識符UNICODE,則TCHAR和指向TCHAR的指針就分別定義為char和指向char的指標:

#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

如果已經在某個表頭文件或者其它表頭文件中定義了TCHAR數據型態,那么WINNT.H和WCHAR.H表頭文件都能防止其重復定義。不過,無論何時在程序中使用其它表頭文件時,都應在所有其它表頭文件之前包含WINDOWS.H。

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

Windows函數呼叫

win32 的鏈接庫文件一般以32結尾,如USER32.DLL,而鏈接庫中字符處理方面的函數都有兩個版本(char 類型的和寬字符類型)。如MessageBox就有兩個版本。幸運的是,您通常不必關心這個問題,程序中只需使用MessageBox即可。 當使用動態連接來編寫windows 程序時,所謂函數“調用”實際會調用user32.dll中真正的函數。這就是所謂的動態連接 而user32.dll是由兩個函數入口的,一個是char型的一個是寬字符類型的通過一系列類似tcahr.h中的宏定義最終會自動選擇調用哪個函數。 MessageBox函數定義如下: int WINAPI MessageBox (HWND, LPCSTR, LPCSTR, UINT) ; 函數的第二個、第三個參數是指向常數字符串的指針。而WINAPI它指定了一個呼叫約定,包括如何生產機械碼以在堆棧中放置函數呼叫的參數。許多Windows函數呼叫聲明為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中定義的相關宏

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

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

windows 中的字符串處理

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

此圖片來自微軟官網

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

而在CRT中字符處理方面的函數遠不止上面那些。我也可以把它進行以下分類

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

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

windows 格式化字符串

c標準中的printf(); int printf (const char * szFormat, …) ;· 而windows 中使用sprintf() int sprintf (char * szBuffer, const char * szFormat, …) ;

第一個參數是字符緩沖區;后面是一個格式字符串。Sprintf不是將格式化結果標準輸出,而是將其存入szBuffer。該函數返回該字符串的長度。在文字模式程序設計中 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顯示結果優于puts。

幾乎每個人都經歷過,當格式字符串與被格式化的變量不合時,可能使printf執行錯誤并可能造成程序當掉。使用sprintf時,您不但要擔心這些,而且還有一個新的負擔:您定義的字符串緩沖區必須足夠大以存放結果。Microsoft專用函數_snprintf解決了這一問題,此函數引進了另一個參數,表示以字符計算的緩沖區大小。

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

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設置為指向一個堆棧變量,該變量地址在堆棧參數szFormat的上面。

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

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

ASCII 寬字符 常規
參數的變數個數
標準版 sprintf swprintf _stprintf
最大長度版 _snprintf _snwprintf _sntprintf
windows版 wsprintfA wsprintfW wsprintf
參數數組的指針
標準版 vsprintf vswprintf vstprintf
最大長度版 _vsnprintf _vsnwprintf _vsntprintf
windwos版 wvsprintfA wvsprintfW wvsprintf

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

【參考】 winodws 程序設計 第五版

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 平臺應用中不支持的 CRT 函數 https://msdn.microsoft.com/library/windows/apps/jj606124.aspx

[轉]C++ Unicode SBCS 函數對照表 http://www.cnblogs.com/PiaoDbg/archive/2012/03/04/2379336.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲四色影视在线观看| 韩国欧美亚洲国产| 欧美激情影音先锋| 亚洲欧美在线一区| 正在播放欧美一区| 欧美一级黄色网| 久久久久久97| 欧美三级欧美成人高清www| 全色精品综合影院| 精品在线欧美视频| 亚洲成人久久电影| 国产69久久精品成人看| 国产精品九九九| 日韩精品福利在线| 国产在线一区二区三区| 美女性感视频久久久| 久久精品这里热有精品| 午夜精品久久久久久久99黑人| 亚洲美女在线观看| 亚洲视频欧洲视频| 久久伊人精品一区二区三区| 日韩av免费一区| 欧美天堂在线观看| 成人黄色片在线| 97免费视频在线| 久久国产精品免费视频| 国产婷婷97碰碰久久人人蜜臀| 国产剧情日韩欧美| 日韩视频免费看| 最新国产精品亚洲| 欧美日韩中文字幕在线| 国产乱肥老妇国产一区二| 精品国产区一区二区三区在线观看| 国产精品青青在线观看爽香蕉| 国产精品夜间视频香蕉| 欧美与欧洲交xxxx免费观看| 欧美日韩一区二区免费在线观看| 久久亚洲私人国产精品va| 欧美精品18videosex性欧美| 亚洲国产欧美一区二区三区同亚洲| 国产精品中文在线| 久久天天躁狠狠躁夜夜av| 成人综合网网址| 久国内精品在线| 国产精品成人v| 一本一本久久a久久精品牛牛影视| 91精品在线观| 欧美一级电影久久| 九九热精品在线| 久久久久久91香蕉国产| 97视频网站入口| 在线国产精品播放| 欧美另类69精品久久久久9999| 国产狼人综合免费视频| 北条麻妃一区二区在线观看| 亚洲第一福利在线观看| 欧美精品福利视频| 亚洲国产成人精品久久| 国产精品香蕉国产| 亚洲伦理中文字幕| 大伊人狠狠躁夜夜躁av一区| 色偷偷偷亚洲综合网另类| 亚洲成人a**站| 亚洲国产高清福利视频| 91av国产在线| 色综合久久精品亚洲国产| 精品国产电影一区| 日韩视频在线免费观看| 国产不卡av在线免费观看| 高清日韩电视剧大全免费播放在线观看| 国模视频一区二区三区| 日韩精品中文在线观看| 国产精品久久久久影院日本| 久久精品国产一区| 中文字幕日韩精品有码视频| 国产精品一香蕉国产线看观看| 精品久久久av| 国产精品久久久久久五月尺| 亚洲综合精品一区二区| 久久九九精品99国产精品| 久久精品国产欧美激情| 亚洲天堂日韩电影| 日韩免费视频在线观看| 久久久亚洲欧洲日产国码aⅴ| 欧美专区国产专区| 国产精品久久久精品| 久久精品亚洲一区| 亚洲欧美国产高清va在线播| 欧美黑人国产人伦爽爽爽| 亚洲一区二区三区xxx视频| 中文字幕日韩av综合精品| 精品国产一区二区三区在线观看| 日韩免费观看视频| 亚洲国产精品人人爽夜夜爽| 成人黄色免费网站在线观看| 色婷婷久久av| 欧美激情中文字幕乱码免费| 亚洲高清免费观看高清完整版| 亚洲少妇中文在线| 91福利视频在线观看| 国产欧美精品va在线观看| 欧美有码在线观看视频| 9.1国产丝袜在线观看| 亚洲嫩模很污视频| 2019中文字幕全在线观看| 亚洲aⅴ日韩av电影在线观看| 九色精品美女在线| 久久在线观看视频| 超薄丝袜一区二区| 国产不卡一区二区在线播放| 在线播放国产一区二区三区| 日韩激情视频在线播放| 福利二区91精品bt7086| 中文一区二区视频| 国产97人人超碰caoprom| 国产精品久久久久久久久久小说| 热久久这里只有| 插插插亚洲综合网| 国产精品免费看久久久香蕉| 亚洲2020天天堂在线观看| 一个人看的www欧美| 久久精品成人欧美大片| 在线视频日韩精品| 亚洲一区二区三| 91亚洲国产精品| 亚洲乱码国产乱码精品精天堂| 亚洲成年人在线播放| 日韩电影免费在线观看| 成人黄在线观看| 在线视频精品一| 欧美肥婆姓交大片| 91精品视频大全| 欧美日韩午夜激情| 国产精品一区二区三区久久久| 亚洲精品网址在线观看| 国产一区二区三区在线观看网站| 欧美一区在线直播| 欧美激情综合色| 欧美极品欧美精品欧美视频| 色哟哟网站入口亚洲精品| 国产日韩欧美在线| 国产精品一区二区三区免费视频| 午夜欧美不卡精品aaaaa| 中文字幕亚洲欧美日韩在线不卡| 国产精品www色诱视频| 欧美午夜精品伦理| 色yeye香蕉凹凸一区二区av| 日本三级久久久| 在线播放精品一区二区三区| 97在线视频观看| 国产人妖伪娘一区91| 久久夜色精品国产亚洲aⅴ| 国产精品久久久久7777婷婷| 成人黄色片网站| 欧美亚州一区二区三区| 欧美成aaa人片免费看| 日韩av免费在线播放| 日韩精品欧美国产精品忘忧草| 亚洲美女在线视频| 国产精品成人av在线| 91精品国产综合久久香蕉最新版| 亚洲天堂视频在线观看| 国产精品7m视频| 国产精品丝袜久久久久久高清|