- windows 的api中大多都有兩個(gè)版本
例如,多字節(jié)字符集的MessageBoxA,接收char類型參數(shù)、和寬字符(unicode)的MessageBoxW,接收wchar_t類型參數(shù)。
"A"系列api的A是指此api接收mbcs的參數(shù),"W"系列接收寬字符字符串。
它們每個(gè)都 一個(gè)沒有后綴的版本如:MessageBox,這個(gè)api其實(shí)取決于unicode的宏定義:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
與之對應(yīng)的,也有參數(shù)類型的定義。
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
編碼
在不同版本的api中,字符串內(nèi)容的編碼也有區(qū)別。
char類型(對應(yīng)MessageBoxA)的編碼取決于本地代碼頁(locale-specific code page)。
wchar_t類型(對應(yīng)MessageBoxW)的編碼為unicode,在windows平臺上,unicode特指utf16,nothing else.MBCS與utf-8
mbcs是"multi-byte character set",多字節(jié)字符集。聽起來這個(gè)字符集應(yīng)該包含utf8。
但是在windows上,MBCS僅代指"A"系列api支持的字符集,它包含的代碼頁有:932 (Shift_JIS), 936 (GBK), 949 (KS_C_5601-1987), 和950 (Big5)。
但是沒有utf-8。
要使用utf8編碼的字符串,要使用MultiByteToWideChar將utf8轉(zhuǎn)為utf16,調(diào)用"W"系列的api.然后再使用WideCharToMultiByte將結(jié)果轉(zhuǎn)為utf8。
其實(shí)在"A"系列的api內(nèi)部也經(jīng)歷了這樣的轉(zhuǎn)變,最終調(diào)用的也是"W"系列的api。在字符集選項(xiàng)中還有一個(gè)“未設(shè)置”,這個(gè)選項(xiàng)下,在代碼里調(diào)用api的時(shí)候,就要看相關(guān)的宏定義了,如上面的
UNICODE或者_MBCS。
ref:
https://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows
https://stackoverflow.com/questions/17742379/visual-studio-character-sets-not-set-vs-multi-byte-character-set