寬位元組字符集和多字符集

2021-06-22 04:54:29 字數 3649 閱讀 7885

unicode   :寬位元組字符集   

1. 如何取得乙個既包含單位元組字元又包含雙位元組字元的字串的字元個數?   

可以呼叫microsoft   visual   c++的執行期庫包含函式_mbslen來操作多位元組(既包括單位元組也包括雙位元組)字串。   

呼叫strlen函式,無法真正了解字串中究竟有多少字元,它只能告訴你到達結尾的0之前有多少個位元組。   

2. 如何對dbcs(雙位元組字符集)字串進行操作?   

函式 描述   

ptstr   charnext   (   lpctstr   ); 返回字串中下乙個字元的位址   

ptstr   charprev   (   lpctstr,   lpctstr   ); 返回字串中上乙個字元的位址   

bool   isdbcsleadbyte(   byte   ); 如果該位元組是dbcs字元的第乙個位元組,則返回非0值   

3. 為什麼要使用unicode?   

(1) 可以很容易地在不同語言之間進行資料交換。   

(2) 使你能夠分配支援所有語言的單個二進位制.exe檔案或dll檔案。   

(3) 提高應用程式的執行效率。   

windows   2000是使用unicode從頭進行開發的,如果呼叫任何乙個windows函式並給它傳遞乙個ansi字串,那麼系統首先要將字串轉換成unicode,然後將unicode字串傳遞給作業系統。如果希望函式返回ansi字串,系統就會首先將unicode字串轉換成ansi字串,然後將結果返回給你的應用程式。進行這些字串的轉換需要占用系統的時間和記憶體。通過從頭開始用unicode來開發應用程式,就能夠使你的應用程式更加有效地執行。   

windows   ce   本身就是使用unicode的一種作業系統,完全不支援ansi   windows函式   

windows   98   只支援ansi,只能為ansi開發應用程式。   

microsoft公司將com從16位windows轉換成win32時,公司決定需要字串的所有com介面方法都只能接受unicode字串。   

4. 如何編寫unicode源**?   

microsoft公司為unicode設計了windowsapi,這樣,可以儘量減少**的影響。實際上,可以編寫單個源**檔案,以便使用或者不使用unicode來對它進行編譯。只需要定義兩個巨集(unicode和_unicode),就可以修改然後重新編譯該原始檔。   

_unicode巨集用於c執行期標頭檔案,而unicode巨集則用於windows標頭檔案。當編譯源**模組時,通常必須同時定義這兩個巨集。   

5. windows定義的unicode資料型別有哪些?   

資料型別 說明   

wchar unicode字元   

pwstr 指向unicode字串的指標   

pcwstr 指向乙個恆定的unicode字串的指標   

對應的ansi資料型別為char,lpstr和lpcstr。   

ansi/unicode通用資料型別為tchar,ptstr,lpctstr。   

6. 如何對unicode進行操作?   

字符集 特性 例項   

ansi 操作函式以str開頭 strcpy   

unicode 操作函式以wcs開頭 wcscpy   

mbcs 操作函式以_mbs開頭 _mbscpy   

ansi/unicode 操作函式以_tcs開頭 _tcscpy(c執行期庫)   

ansi/unicode 操作函式以lstr開頭 lstrcpy(windows函式)   

所有新的和未過時的函式在windows2000中都同時擁有ansi和unicode兩個版本。ansi版本函式結尾以a表示;unicode版本函式結尾以w表示。windows會如下定義:   

#ifdef     unicode   

#define     createwindowex     createwindowexw   

#else   

#define     createwindowex     createwindowexa   

#endif       //   !unicode   

7. 如何表示unicode字串常量?   

字符集 例項   

ansi 「string」   

unicode l「string」   

ansi/unicode t(「string」)或_text(「string」)if(   szerror[0]   ==   _text(『j』)   )   

8. 為什麼應當盡量使用作業系統函式?   

這將有助於稍稍提高應用程式的執行效能,因為作業系統字串函式常常被大型應用程式比如作業系統的外殼程序explorer.exe所使用。由於這些函式使用得很多,因此,在應用程式執行時,它們可能已經被裝入ram。   

如:strcat,strchr,strcmp和strcpy等。   

9. 如何編寫符合ansi和unicode的應用程式?   

(1) 將文字串視為字元陣列,而不是chars陣列或位元組陣列。   

(2) 將通用資料型別(如tchar和ptstr)用於文字字元和字串。   

(3) 將顯式資料型別(如byte和pbyte)用於位元組、位元組指標和資料快取。   

(4) 將text巨集用於原義字元和字串。   

(5) 執行全域性性替換(例如用ptstr替換pstr)。   

(6) 修改字串運算問題。例如函式通常希望在字元中傳遞乙個快取的大小,而不是位元組。這意味著不應該傳遞sizeof(szbuffer),而應該傳遞(sizeof(szbuffer)/sizeof(tchar)。另外,如果需要為字串分配乙個記憶體塊,並且擁有該字串中的字元數目,那麼請記住要按位元組來分配記憶體。這就是說,應該呼叫malloc(ncharacters   *sizeof(tchar)),而不是呼叫malloc(ncharacters)。   

10. 如何對字串進行有選擇的比較?   

通過呼叫comparestring來實現。   

標誌 含義   

norm_ignorecase 忽略字母的大小寫   

norm_ignorekanatype 不區分平假名與片假名字元   

norm_ignorenonspace 忽略無間隔字元   

norm_ignoresymbols 忽略符號   

norm_ignorewidth 不區分單位元組字元與作為雙位元組字元的同乙個字元   

sort_stringsort 將標點符號作為普通符號來處理   

11. 如何判斷乙個文字檔案是ansi還是unicode?   

判斷如果文字檔案的開頭兩個位元組是0xff和0xfe,那麼就是unicode,否則是ansi。   

12. 如何判斷一段字串是ansi還是unicode?   

用istextunicode進行判斷。istextunicode使用一系列統計方法和定性方法,以便猜測快取的內容。由於這不是一種確切的科學方法,因此   istextunicode有可能返回不正確的結果。   

13. 如何在unicode與ansi之間轉換字串?   

windows函式multibytetowidechar用於將多位元組字串轉換成寬字串;函式widechartomultibyte將寬字串轉換成等價的多位元組字串。 

多位元組字符集和寬位元組字符集區別

多位元組字符集 字元編碼可能是1個位元組 也可能是2個位元組 ascii碼占用1個位元組儲存 中文 unicode 等 占用2個位元組 it學吧 16進製制編碼 73 84 47 89 80 55 0 16進製制最高位為1 代表負數 當存在負數則會把兩個負數當做乙個中文字元 73 i 1位元組 84...

單位元組字符集,多位元組字符集,Unicode

我們在這裡介紹一下字元型別。這裡有3種編碼模式對應3種字元型別。第一種編碼型別是單子節字符集 single byte character set or sbcs 在這種編碼模式下,所有的字元都只用乙個位元組表示。ascii是sbcs。乙個位元組表示的0用來標誌sbcs字串的結束。第二種編碼模式是多位...

Unicode字符集和多字符集

由於各國語言的加入,ascii已經不能滿足資訊交流的需要,因此,為了能夠表示其它國家的文字,各國在ascii的基礎上制定了自己的字符集,它們正式的名稱應該是mbcs multi byte chactacter system,即多位元組字元系統 型別說明 unicode ansi 通用型別 字元wch...