使用Unicode 寬位元組字符集 兼談 T與L

2021-06-18 07:01:55 字數 4764 閱讀 9223

_t會根據你工程的設定自動轉換unicode和非unicode.   

l就是轉為unicode

visual c++裡邊定義字串的時候,用_t來保證相容性,是一種資料型別,但是它不會產生結果,被編譯系統的預處理系統來解釋,vc支援ascii和unicode兩種字元型別,用_t可以保證從ascii編碼型別轉換到unicode編碼型別的時候,程式不需要修改。

如果將來你不打算公升級到unicode,那麼也不需要_t!

_t是將字串轉換為tchar,tchar是乙個巨集定義,當定義了unicode時tchar等同於wchar,否則等同於char。為了和以後的平台相容,建議使用tchar,而不要使用普通的char。例子:tchar   *s   =   _t("fsdf") 

l將字串轉換為wchar,用於需要unicode的環境。例子:wchar   *s   =   l"fsdf"

此外,_text 和_t 一樣的

example:

setwindowtext(_t("我很好")); 

在中文win2000上正常,在英文win2000下就是亂碼! 

// _t()自動將()內字串轉成unicode or multibyte-character or sbcs (ascii) 根據系統巨集定義, 

// 為了將程式與vb等unicode 編碼的程式互動,為了程式的國際化,為了... 

// 看msdn! 如果定義了 unicode 就變成 l把字串轉換成寬字元,否則沒用。 

// 統一的字元編碼標準, 採用雙位元組對字元進行編碼 

// _t把引數轉換成當前系統支援的字元,例如支援unicode就轉換成寬字元,否則就是單字元 

#ifdef unicode 

#define _t(x) l##x 

#else 

#define _t(x) x 

#endif 

_t/_text是在tchar.h標頭檔案中定義的巨集。 

在_unicode和_mbcs都沒有定義時,對其後的字串無影響 

在_mbcs定義時,對其後的字串無影響 

在_unicode定義時,其後的字串被定義為 l(即轉換為unicode字元) 

本質上是為了生成unicode和非unicode通用的程式而定義的巨集。

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。   

ansiunicode通用資料型別為tchar,ptstr,lpctstr。   

6. 如何對unicode進行操作?   

字符集 特性 例項   

ansi 操作函式以str開頭 strcpy   

unicode 操作函式以wcs開頭 wcscpy   

mbcs 操作函式以_mbs開頭 _mbscpy   

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

ansiunicode 操作函式以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」   

ansiunicode 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將寬字串轉換成等價的多位元組字串。

Unicode 寬位元組字符集

unicode 寬位元組字符集 1.如何取得乙個 既包含單位元組字元又包含雙位元組字元的字串的字元個數?可以呼叫 microsoft visual c 的執行期庫包含函式 mbslen 來操作多位元組 既包括單位元組也包括雙位元組 字串。呼叫 strlen 函式,無法真正了解字串中究竟有多少字元,它...

Windows字符集 寬位元組(Unicode)

如果想讓多位元組轉為寬位元組,即在前面加大寫l,如 messagebox aaa messagebox l aaa 這樣就可以成功使用messagebox這個函式了,該函式大家應該都不陌生,就是mfc中的資訊顯示函式。下面介紹一些常用的字元轉換 統計多位元組字串的長度 int num 0 char ...

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

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