一說這個話題,肯定涉及ms的字符集,先看ms對_t(其中_text(")與_t("")一樣)的定義:
#define _t(x) __t(x)
#define _text(x) __t(x)
如果定義了_unicode識別符號,那麼乙個稱作__t的巨集就定義如下:
#define __t(x) l##x
如果沒有定義_unicode識別符號,則__t巨集只簡單地定義如下:
#define __t(x) x
舉個例子,可以明白:
cstring str = _t("12345");
在非 unicode 工程下等於:
cstring str = "12345";
在 unicode 工程下等於:
cstring str = l"12345";
這個在編譯時就決定了,其實就是個巨集替換。
l是表示unicode
_t可以是unicode,也可以是ansi,這要看編譯設定。
_t會根據你工程的設定自動轉換unicode和非unicode,加l就是轉為unicode。
vc6.0設定unicode編譯環境可以參考:
下面給出乙個問題集錦**自網路,作了部分修改:
可以呼叫microsoft visual c++的執行期庫包含函式_mbslen來操作多位元組(既包括單位元組也包括雙位元組)字串。而
呼叫strlen函式,無法真正了解字串中究竟有多少字元,它只能告訴你到達結尾的0之前有多少個位元組。
函式描述:
bool isdbcsleadbyte( byte );//如果該位元組是dbcs字元的第乙個位元組,則返回非0值
優點:
(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字串。
microsoft公司為unicode設計了windowsapi,這樣,可以儘量減少**的影響。實際上,可以編寫單個源**檔案,以便使用或者不使用unicode來對它進行編譯。只需要定義兩個巨集(unicode和_unicode),就可以修改然後重新編譯該原始檔。
_unicode巨集用於c執行期標頭檔案,而unicode巨集則用於windows標頭檔案。當編譯源**模組時,通常必須同時定義這兩個巨集。
資料型別說明:
wchar //unicode字元
pwstr //指向unicode字串的指標
pcwstr //指向乙個恆定的unicode字串的指標
對應的ansi資料型別為:char,lpstr和lpcstr。
ansi/unicode通用資料型別為:tchar,ptstr,lpctstr。
字符集特性例項:
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
字符集例項(跟上述事例類似):
ansi「string」
unicodel「string」
ansi/unicodet(「string」)或_text(「string」)
if( szerror[0] == _text(『j』) )
這將有助於稍稍提高應用程式的執行效能,因為作業系統字串函式常常被大型應用程式比如作業系統的外殼程序explorer.exe所使用
。由於這些函式使用得很多,因此,在應用程式執行時,它們可能已經被裝入ram。
如:strcat,strchr,strcmp和strcpy等。
(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)。
通過呼叫comparestring來實現。
標誌含義
norm_ignorecase 忽略字母的大小寫
norm_ignorekanatype 不區分平假名與片假名字元
norm_ignorenonspace 忽略無間隔字元
norm_ignoresymbols 忽略符號
norm_ignorewidth 不區分單位元組字元與作為雙位元組字元的同乙個字元
sort_stringsort 將標點符號作為普通符號來處理
判斷如果文字檔案的開頭兩個位元組是0xff和0xfe,那麼就是unicode,否則是ansi。
用istextunicode進行判斷。istextunicode使用一系列統計方法和定性方法,以便猜測快取的內容。由於這不是一種確切的科學方法,因此istextunicode有可能返回不正確的結果。
windows函式multibytetowidechar用於將多位元組字串轉換成寬字串;函式widechartomultibyte將寬字串轉換成等價的多位元組字串。
C 中 T()與L的區別
字串前面加l表示該字串是unicode字串。t是乙個巨集,如果專案使用了unicode字符集 定義了unicode巨集 則自動在字串前面加上l,否則字串不變。因此,visual c 裡邊定義字串的時候,用 t來保證相容性。vc支援ascii和unicode兩種字元型別,用 t可以保證從ascii編碼...
C 中L與 T 的區別
字串前面加l表示該字串是unicode字串。t是乙個巨集,如果專案使用了unicode字符集 定義了unicode巨集 則自動在字串前面加上l,否則字串不變。因此,visual c 裡邊定義字串的時候,用 t來保證相容性。vc支援ascii和unicode兩種字元型別,用 t可以保證從ascii編碼...
C 中L和 T 之區別
字串前面加l表示該字串是unicode字串。t是乙個巨集,如果專案使用了unicode字符集 定義了unicode巨集 則自動在字串前面加上l,否則字串不變。因此,visual c 裡邊定義字串的時候,用 t來保證相容性。vc支援ascii和unicode兩種字元型別,用 t可以保證從ascii編碼...