1.MultiByteToWideChar
函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组。
函数原型:
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
2.WideCharToMultiByte
函数功能:该函数映射一个unicode字符串到一个多字节字符串。
函数原型:
int WideCharToMultiByte(
UINT CodePage, //指定执行转换的代码页
DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符
LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区
int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数
LPSTR lpMultiByteStr, //指向接收被转换字符串的缓冲区
int cchMultiByte, //指定由参数lpMultiByteStr指向的缓冲区最大值
LPCSTR lpDefaultChar, //遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符
LPBOOL pfUsedDefaultChar //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
);
3.代码案例
// unicode.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>//-------------------------------------------------------------------------------------
//Description:
// This function maps a character string to a wide-character (Unicode) string
//
//Parameters:
// lpcszStr: [in] Pointer to the character string to be converted
// lpwszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));
//---------------------------------------------------------------------------------------
BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
{// Get the required size of the buffer that receives the Unicode // string. DWORD dwMinSize;dwMinSize = MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, NULL, 0);if (dwSize<dwMinSize){return FALSE;}// Convert headers from ASCII to Unicode. MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);return TRUE;
}
//-------------------------------------------------------------------------------------
//Description:
// This function maps a wide-character string to a new character string
//
//Parameters:
// lpcwszStr: [in] Pointer to the character string to be converted
// lpszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
//---------------------------------------------------------------------------------------
BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
{DWORD dwMinSize;dwMinSize = WideCharToMultiByte(CP_OEMCP, NULL, lpcwszStr, -1, NULL, 0, NULL, FALSE);if (dwSize<dwMinSize){return FALSE;}WideCharToMultiByte(CP_OEMCP, NULL, lpcwszStr, -1, lpszStr, dwSize, NULL, FALSE);return TRUE;
}
int main()
{wchar_t wText[] = { L"unicode字符串" };char sText[100] = { "ANSI 字符串" };WCharToMByte(wText, sText, sizeof(sText) / sizeof(sText[0]));欲生效需要屏蔽MByteToWChar(sText, wText, sizeof(wText) / sizeof(wText[0]));printf("%d\n", lstrlenW(wText));printf("%d\n", lstrlenA(sText));printf("%d\n", sizeof(wText));printf("%d\n", sizeof(sText));printf("输出WideCharToMultiByte unicode转多字节\n");printf("输出unicode wText:\n");for (int j = 0; j<lstrlen(wText); j++)printf("%c", wText[j]);printf("\n输出ANSI sText:\n");for (int j = 0; j<sizeof(sText); j++)printf("%c", sText[j]);printf("\n\n");/*MByteToWChar(sText, wText, sizeof(wText) / sizeof(wText[0]));//欲生效需要屏蔽WCharToMByte(wText, sText, sizeof(sText) / sizeof(sText[0]));printf("输出MultiByteToWideChar 多字节转unicode\n");printf("\n输出unicode wText:\n");for (int j = 0; j<lstrlenW(wText); j++)printf("%c", wText[j]);printf("\n输出ANSI sText:\n");for (int j = 0; j<sizeof(sText); j++)printf("%c", sText[j]);printf("\n\n\n\n");// return 0;*///第二案例///*// TODO: Place code here.wchar_t wszTest[] = L"unicod";wchar_t wszTestNew[] = L"unicod字符串";int nwszTestLen = lstrlenW(wszTest); // 6int nwszTestNewLen = lstrlenW(wszTestNew); // 9 int nwszTestSize = sizeof(wszTest); // 14int nwszTestNewSize = sizeof(wszTestNew); // 20printf("[unicode]长度:\n");for (int j = 0; j<nwszTestLen; j++)printf("%c", wszTest[j]);printf("\n");printf("[unicode字符串]长度:\n");for (int j = 0; j<nwszTestNewLen; j++)printf("%c", wszTestNew[j]);printf("\n");printf("[unicode]大小:\n");for (int j = 0; j<nwszTestSize; j++)printf("%c", wszTest[j]);printf("\n");printf("[unicode字符串]大小:\n");for (int j = 0; j<nwszTestNewSize; j++)printf("%c", wszTestNew[j]);printf("\n");int nChar = WideCharToMultiByte(CP_ACP, 0, wszTestNew, -1, NULL, 0, NULL, NULL); // 13, 返回结果已包含'\0'所要占用的内存nChar = nChar * sizeof(char); // 13, 其实这一步可不需要,请见本文前面解释char* szResult = new char[nChar];ZeroMemory(szResult, nChar);int i = WideCharToMultiByte(CP_ACP, 0, wszTestNew, -1, szResult, nChar, NULL, NULL); // 13int nszResultLen = lstrlenA(szResult); // 12int nszResultSize = sizeof(szResult); // 4printf("[unicode字符串]转换后长度:\n");for (int j = 0; j<nszResultLen; j++)printf("%c", szResult[j]);printf("\n");printf("[unicode字符串]转换后大小:\n");for (int j = 0; j<nszResultSize; j++)printf("%c", szResult[j]);printf("\n\n\n\n\n");char szTest[] = "ANSIxx";char szTestNew[] = "ANSIxx字符串";int nszTestLen = lstrlenA(szTest); // 6int nszTestNewLen = lstrlenA(szTestNew); // 12int nszTestSize = sizeof(szTest); // 7int nszTestNewSize = sizeof(szTestNew); // 13printf("[ANSI]长度:\n");for (int j = 0; j<nszTestLen; j++)printf("%c", szTest[j]);printf("\n");printf("[ANSI字符串]长度:\n");for (int j = 0; j<nszTestNewLen; j++)printf("%c", szTestNew[j]);printf("\n");printf("[ANSI]大小:\n");for (int j = 0; j<nszTestSize; j++)printf("%c", szTestNew[j]);printf("\n");printf("[ANSI字符串]大小:\n");for (int j = 0; j<nszTestNewSize; j++)printf("%c", szTestNew[j]);printf("\n");int nWChar = MultiByteToWideChar(CP_ACP, 0, szTestNew, -1, NULL, 0); // 10, 返回结果已包含'\0'所要占用的内存nWChar = nWChar * sizeof(wchar_t); // 20wchar_t* wszResult = new wchar_t[nWChar];ZeroMemory(wszResult, nWChar);int j = MultiByteToWideChar(CP_ACP, 0, szTestNew, -1, wszResult, nWChar); // 10int nwszResultLen = lstrlenW(wszResult); // 9int nwszResultSize = sizeof(wszResult); // 4printf("[ANSI字符串]转换后长度:\n");for (int j = 0; j<nwszResultLen; j++)printf("%c", wszResult[j]);printf("\n");printf("[ANSI字符串]转换后大小:\n");for (int j = 0; j<nwszResultSize; j++)printf("%c", wszResult[j]);printf("\n");return 0;//*/}
4.结果