MFC中MultiByteToWideChar和WideCharToMultiByte
MultiByteToWideChar
作用:
可以映射一个字符串到一个宽字节(Unicode) 的字符串 .由该函数映射的字符串没必要是多字节字符组。
函数原型:
int
WINAPI
MultiByteToWideChar(_In_ UINT CodePage,_In_ DWORD dwFlags,_In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr,_In_ int cbMultiByte,_Out_writes_to_opt_(cchWideChar,return) LPWSTR lpWideCharStr,_In_ int cchWideChar);
参数:
- //指定要转换成的字符集代码页
- //flags一般设置为0
- //要转换的字符串
- //要转换字符串的长度,-1表示转换到字符串结尾。返回原字符串长度。0 作为结束符的字符串
- //接收转换后输出的宽字符串的缓冲,如果为 NULL, 就是代表计算生成的字符串的长度。
- //缓冲区大小
返回值:
如果函数运行成功,并且cchWideChar不为0,返回值是由lpWideCharStr指向的缓冲区中写入的宽字符数;如果函数运行成功,并且cchMultiByte为0,返回值是待转换字符串的缓冲区所需求的宽字符数大小。(此种情况用来获取转换所需的wchar_t的个数)如果函数运行失败,返回值为零。
## WideCharToMultiByte
**作用:**
该函数映射一个unicode字符串到一个多字节字符串。 **函数原型:**```cpp
int
WINAPI
MultiByteToWideChar(_In_ UINT CodePage,_In_ DWORD dwFlags,_In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr,_In_ int cbMultiByte,_Out_writes_to_opt_(cchWideChar,return) LPWSTR lpWideCharStr,_In_ int cchWideChar);
参数:
- //指定执行转换的代码页
- //flags一般设置为0
- //要转换的字符串
- // 待转换的宽字符串。
- // 待转换宽字符串的长度,-1表示转换到字符串结尾
- //接收转换后输出新串的缓冲区。
- // 输出缓冲区大小,如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不使用lpMultiByteStr。
- //指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。如果为NULL则使用系统默认字符。
- //开关变量的指针,用以表明是否使用过默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。
返回值:
如果函数成功,且cbMultiByte非0,返回写入lpMultiByteStr的字节数(包括字符串结尾的null);cbMultiByte为0,则返回转换所需 字节数。函数失败,返回0。
补充:
第一个参数常用的是CP_ACP和CP_UTF8了,前者将宽字符转换为ANSI,后者转换为UTF8。
其他的字符集代码页:
CP_ACP
ANSI代码页
CP_MACCP
Macintosh代码页
CP_OEMCP
OEM代码页
CP_SYMBOL
符号代码页(42)
CP_THREAD_ACP
当前线索ANSI代码页
CP_UTF7
使用UTF-7转
CP_UTF8
使用UTF-8转换
综合例子
void CMFCApplication1Dlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码#define MAX 100char c[MAX] = { 0 };WCHAR wc[MAX] = { 0 };char utf8[MAX] = { 0 };sprintf(c, "hello");int mi = MultiByteToWideChar(CP_ACP, 0, c, -1, wc, MAX); //多字节转换成宽字节int wi = WideCharToMultiByte(CP_UTF8, 0, wc, -1, utf8, MAX, NULL, NULL); //宽字节转换成多字节CString str;str.Format("mi = %d\t wi =%d\n", mi, wi); //格式化字符OutputDebugString(str); //输出调试信息
运行结果: