MultiByteToWideChar&WideCharToMultiByte 函数介绍

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.结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值