【转载】 MultiByteToWideChar和WideCharToMultiByte用法详解

本文详细介绍了在Windows环境下如何使用MultiByteToWideChar和WideCharToMultiByte函数进行字符编码转换,包括从多字节到宽字符及反向转换的具体步骤,并提供了避免内存浪费的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

本文转载自:http://blog.youkuaiyun.com/norains/article/details/1461174

 

//========================================================================
//TITLE:
//    MultiByteToWideChar和WideCharToMultiByte用法详解
//AUTHOR:
//    norains
//DATE:
//    第一版:Monday  25-December -2006
//    增补版:Wednesday 27-December -2006
//    修订版:Wednesday 14-March-2007 (修正之前的错误例子)
//    再次修订版:Tuesday 18-September-2007 (修正代码的参数错误)

//    再再次修订版:Friday 02-April-2009 (修正文章举例的错误)
//Environment:
//  EVC4.0 + Standard SDK
//========================================================================
 
1.使用方法详解

  在本文开始之处,先简要地说一下何为短字符和宽字符.
  所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于 windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.
 
  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.
  好吧,那就让我们开始吧.
 

 1   //这个是我们需要转化的多字节字符串:  
 2   char sText[20] = {"多字节字符串!OK!"};
 3  
 4   //我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20个宽字符的数组
 5   //(如果全部是中文,则宽字符数组需要10 个;反之,如果是英文字符,则需要20个。这里选取的是最大值),并且事实上将运行得非常轻松愉快.
 6   //但假如多字节字符串更多,达到上千个乃至上万个,我们 将会发现其中浪费的内存将会越来越多.
 7   //所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.
 8   //所幸,我们能够确知所需要的数组空间.
 9   //我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的宽字符数组空间的个数:
10   DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
11  
12   //接下来,我们只需要分配响应的数组空间:
13   wchar_t *pwText;
14   pwText = new wchar_t[dwNum];
15   if(!pwText)
16   {
17    delete []pwText;
18   }
19  
20   //接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:
21   MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);
22  
23   //最后,使用完毕当然要记得释放占用的内存:
24   delete []pwText;
25  
26  
27   //同理,宽字符转为多字节字符的代码如下:  
28   wchar_t wText[20] = {L"宽字符转换实例!OK!"};
29   DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);
30   char *psText;
31   psText = new char[dwNum];
32   if(!psText)
33   {
34    delete []psText;
35   }
36   WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);
37   delete []psText;


   如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
   WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:

 1      
 2   //-------------------------------------------------------------------------------------
 3   //Description:
 4   // This function maps a character string to a wide-character (Unicode) string
 5   //
 6   //Parameters:
 7   // lpcszStr: [in] Pointer to the character string to be converted
 8   // lpwszStr: [out] Pointer to a buffer that receives the translated string.
 9   // dwSize: [in] Size of the buffer
10   //
11   //Return Values:
12   // TRUE: Succeed
13   // FALSE: Failed
14   //
15   //Example:
16   // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));
17   //---------------------------------------------------------------------------------------
18   BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
19   {
20     // Get the required size of the buffer that receives the Unicode
21     // string.
22     DWORD dwMinSize;
23     dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
24  
25     if(dwSize < dwMinSize)
26     {
27      return FALSE;
28     }
29  
30     
31     // Convert headers from ASCII to Unicode.
32     MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  
33     return TRUE;
34   }
35  
36   //-------------------------------------------------------------------------------------
37   //Description:
38   // This function maps a wide-character string to a new character string
39   //
40   //Parameters:
41   // lpcwszStr: [in] Pointer to the character string to be converted
42   // lpszStr: [out] Pointer to a buffer that receives the translated string.
43   // dwSize: [in] Size of the buffer
44   //
45   //Return Values:
46   // TRUE: Succeed
47   // FALSE: Failed
48   //
49   //Example:
50   // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
51   //---------------------------------------------------------------------------------------
52   BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
53   {
54    DWORD dwMinSize;
55    dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
56    if(dwSize < dwMinSize)
57    {
58     return FALSE;
59    }
60    WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
61    return TRUE;
62   }
63  
64  
65   //使用方法也很简单,示例如下:
66   wchar_t wText[10] = {L"函数示例"};
67   char sText[20]= {0};
68   WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
69   MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));

 


 
  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.

 
2.MultiByteToWideChar()函数乱码的问题

  有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.
  不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以 肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".
  系统定制时选择默认语言的位置于:
  Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.

转载于:https://www.cnblogs.com/fanqs/archive/2013/03/28/2987246.html

内容概要:本文详细介绍了900W或1Kw,20V-90V 10A双管正激可调电源充电机的研发过程技术细节。首先阐述了项目背景,强调了充电机在电动汽车可再生能源领域的重要地位。接着深入探讨了硬件设计方面,包括PCB设计、磁性器件的选择及其对高功率因数的影响。随后介绍了软件实现,特别是程序代码中关键的保护功能如过流保护的具体实现方法。此外,文中还提到了充电机所具备的各种保护机制,如短路保护、欠压保护、电池反接保护、过流保护过温度保护,确保设备的安全性可靠性。通讯功能方面,支持RS232隔离通讯,采用自定义协议实现远程监控控制。最后讨论了散热设计的重要性,以及为满足量产需求所做的准备工作,包括提供详细的PCB图、程序代码、BOM清单、磁性器件散热片规格书等源文件。 适合人群:从事电力电子产品研发的技术人员,尤其是关注电动汽车充电解决方案的专业人士。 使用场景及目标:适用于需要高效、可靠充电解决方案的企业个人开发者,旨在帮助他们快速理解应用双管正激充电机的设计理念技术要点,从而加速产品开发进程。 其他说明:本文不仅涵盖了理论知识,还包括具体的工程实践案例,对于想要深入了解充电机内部构造工作原理的人来说是非常有价值的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值