我在為公司編寫打印機程序時,遇到了一個字符串傳參時格式的問題,看了這個人的博客,解決了問題,現(xiàn)在轉(zhuǎn)載過來:http://blog.csdn.net/lihao21
我們熟悉的ASCII碼全稱是美國國家信息交換標準碼,它起源于20世紀50年代末,并于1967年最終定型。ASCIIS碼使用7位(bit)的寬度,有26個小寫字母,26個大寫字母,10個數(shù)字,32個符號,33個控制碼,一個空格碼,共128個代碼。 ASCII的使用相當普及,是一種非常可靠的標準。但是,ASCII是一個美國的標準,它甚至滿足不了其他英語國家的需求,例如,ASCII碼并沒有英鎊符號。 我們知道,一些語言文字系統(tǒng)(例如中國的漢字)的字符集有非常多的符號,但一個字節(jié)最多只能表示256個符號,這是遠遠不夠的。為了支持這些文字系統(tǒng),雙字節(jié)字符集(doube-byte character set, DBCS)應運而生。在雙字節(jié)字符集中,一個字符由1個或2個字節(jié)組成。對程序員來說,和雙字節(jié)字符集打交道就如同一場噩夢,因為程序員需要判斷每個字節(jié)是否雙字節(jié)的前導字節(jié)。 Unicode是1988年由Apple與Xerox共同建立的一項標準。與DBCS的混亂不同,Unicode統(tǒng)一使用16位進行編碼,即UTF-16編碼。UTF的全稱是Unicode Transformation Format(Unicode轉(zhuǎn)換格式)。UTF-16將每個字符編碼為2個字節(jié)(16位)。這樣一來,程序員在處理這種格式的編碼時,就顯得相對簡單。 除了UTF-16編碼,還有其他用于表示字符的UTF標準。UTF-8UTF-8將一些字符編碼為1個字節(jié),一些字符編碼為2個字節(jié),一些字符編碼為3個字節(jié),一些字符編碼為4個字節(jié)。值在0x0080以下的字符壓縮為1個字節(jié),這對美國使用的字符非常適合。0x0080和0x07ff之間的字符轉(zhuǎn)換為2個字節(jié),這對歐洲和中東地區(qū)的語言非常適合。0x0800以上的字符都轉(zhuǎn)換為3個字節(jié),適合東亞地區(qū)的語言。使用代理對(surrogate pair)轉(zhuǎn)換為4個字節(jié)。UTF-8是一種非常流行的編碼格式。UTF-32UTF-32將所有的字符都編碼為4個字節(jié)。從使用的角度來看,由于所有字符的字節(jié)數(shù)一定,所以處理起來較為簡單。但從內(nèi)存使用的角度來看,UTF-32并不是一種高效的編碼方式。因此,在網(wǎng)絡傳輸?shù)葓龊?,很少會使用UTF-32這種編碼格式。UTF-32一般在應用程序內(nèi)部使用。 在談到Unicode時,除非特別聲明,我們一般是指UTF-16編碼。
在寫代碼的時候,可以使用ANSI 或Unicode字符/字符串。為使其能通過編譯,windows定義了以下的類型的宏:
[cpp] view plain copy#ifdef UNICODE typedef WCHAR TCHAR, *PTCHAR, PTSTR; typedef CONST WCHAR *PCTSTR; #define __TEXT(quote) L##quote #else typedef CHAR TCHAR, *PTCHAR, PTSTR; typedef CONST CHAR *PCTSTR; #define __TEXT(quote) quote #endif #define TEXT(quote) __TEXT(quote) 利用這些類型和宏,無論使用ANSI還是Unicode,都可以通過編譯。[cpp] view plain copy// 若定義了UNICODE,則作用16位的字符,否則使用8位的字符 TCHAR C = TEXT('A'); // 若定義了UNICODE,則作用16位的字符串,否則使用8位的字符串 TCHAR szBuffer[100] = TEXT("A String");新聞熱點
疑難解答