之前经常用到看到这个API,但是中文资料的解释似乎都不太清楚也不太全。今天找了下英文资料,从MSDN上得到了详细而满意的答案。
MDN链接如下:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx
int MultiByteToWideChar(
__in UINT CodePage,
__in DWORD dwFlags,
__in LPCSTR lpMultiByteStr,
__in int cbMultiByte,
__out_opt LPWSTR lpWideCharStr,
__in int cchWideChar);
这个方法是将一个字符串映射成为一个UTF-16的宽字符,而且这个字符串不要求一定是来自多个窄字符(char)表示的字符集(如GB2312这样的ANSI字符集),它也可以是utf-8编码表示的UNCODE这样宽字符(wchar_t)表示的字符集。换句话说,这个字符串可以是多个字节表示的ANSI编码字符串,也可以是多个字节表示的utf-8编码方式的UNICODE字符串,或者是别的编码方式表示的字符串。
最为重要的就是第一个参数CodePage了,这里描述得非常的清楚。这个参数是执行soruce字符串的编码类型,这样系统就知道怎么去解释和转换source字符串了。CodePage可以是当前系统默认带的utf-8,也可以是你需要安装后才能使用的gb2312等。具体的CodePage值,你可以直接指定value,CodePage list如下链接:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
当然,你也可以不指定具体的codepage value, 而是指定微软提供的几个参数value,来让os根据这个参数自己来设置具体的codepage值。如你可以选择CP_ACP,这个参数的含义就是os会选择当前系统默认的ANSI code page。 但是这个默认的ANSI code page在不同机器上可能是不同的,在同一机器上也可以通过设置来更改为不同的值。例如,同一机器上你可以设置它为GB2312,你也可以设置它为BIG5。所以当你选择CP_ACP时,具体的code page是和你的系统环境相关的。