- 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
與之對(duì)應(yīng)的氓皱,也有參數(shù)類型的定義路召。
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
編碼
在不同版本的api中勃刨,字符串內(nèi)容的編碼也有區(qū)別。
char
類型(對(duì)應(yīng)MessageBoxA
)的編碼取決于本地代碼頁(yè)(locale-specific code page)股淡。
wchar_t
類型(對(duì)應(yīng)MessageBoxW
)的編碼為unicode
身隐,在windows平臺(tái)上,unicode特指utf16,nothing else.MBCS與utf-8
mbcs是"multi-byte character set",多字節(jié)字符集揣非。聽起來(lái)這個(gè)字符集應(yīng)該包含utf8抡医。
但是在windows上,MBCS
僅代指"A"系列api支持的字符集早敬,它包含的代碼頁(yè)有: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