mbs: multi byte string, 用char作為存儲類型, 一個字符可能對應1個或者多個char, 不能直接確定字符邊界. charset不確定. 過去的程序都是采用mbs的.
wcs: wide character string, 用wchar_t作為存儲類型, 一個字符對于一個wchar_t. 使用unicode編碼, charset與OS相關, 在windows平臺中為UTF16(UCS-2), 在大多數unix平臺中為UTF32(UCS-4).
國際化的程序都應該在內部使用wcs, 在輸入輸出時做mbs與wcs的轉換.
mbs與wcs的轉換函數:
wcstombs/mbstowcs是實現轉換的一對函數. wcs的charset是固定不可變的, 但是mbs的charset是可變的, 可能是ASCII, 可能是gb2312, 也可能是big5. wcstombs/mbstowcs是根據locale環境設置來決定mbs采用的charset的, 在程序中可以用setlocale來設定locale, 例如 setlocale(LC_ALL, "chinese")
程序啟動時, locale設定為 LC_ALL="C", 用 setlocale(LC_ALL, "") 就可以設置成操作系統的locale設定.
Locale決定了當前程序運行的本地化設置方式, 但是在程序中可能需要作其他charset的轉換, 例如程序本身語言設定為簡體中文, 需要做big5與unicode的轉換, 或者是其他兩種charset的mbstombs轉換, 這時wcstombs/mbstowcs就不能勝任了. 在unix平臺中可以使用iconv來做這個轉換(iconv lib也有windows版本), 在windows平臺可以用MultiByteToWideChar/WideCharToMultiByte 函數.
參考資料: http://xcin.linux.org.tw/i18n/pc2000/p3/chinese-3.html
----------------------------------------------------------------
wcstombs和mbstowcs使用
#include <locale.h>
setlocale(LC_ALL, ".936");
wcstombs(char * to,wchar_t * from,size_t _maxCount);
mbstowcs(wchar_t * to,char * from,size_t _maxCount);