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); // 6
int nwszTestNewLen = lstrlenW(wszTestNew); // 9
int nwszTestSize = sizeof(wszTest); // 14
int nwszTestNewSize = sizeof(wszTestNew); // 20
printf("[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); // 13
int nszResultLen = lstrlenA(szResult); // 12
int nszResultSize = sizeof(szResult); // 4
printf("[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); // 6
int nszTestNewLen = lstrlenA(szTestNew); // 12
int nszTestSize = sizeof(szTest); // 7
int nszTestNewSize = sizeof(szTestNew); // 13
printf("[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); // 20
wchar_t* wszResult = new wchar_t[nWChar];
ZeroMemory(wszResult, nWChar);
int j = MultiByteToWideChar(CP_ACP, 0, szTestNew, -1, wszResult, nWChar); // 10
int nwszResultLen = lstrlenW(wszResult); // 9
int nwszResultSize = sizeof(wszResult); // 4
printf("[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.结果