您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 2浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

UNICODE转多字节

phymat.nico 发布时间:2015-01-07 11:16:08 ,浏览量:2

String是采用的Unicode编码char使用的Multi-Byte是不一样的,

这函数,使用的是标准C函数。需要头文件cstdlib和clocale。针对中文的unicode写的函数。

//========================================================================

//TITLE:

//   MultiByteToWideChar和WideCharToMultiByte用法详解

//AUTHOR:

//   norains

//DATE:

//   第一版:Monday  25-December -2006

//   增补版:Wednesday 27-December -2006

//   修订版:Wednesday 14-March-2007 (修正之前的错误例子)

//Environment:

//  EVC4.0 + Standard SDK

//========================================================================

 

1.使用方法详解

  在本文开始之处,先简要地说一下何为短字符和宽字符.

 所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.

 

  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.

  好吧,那就让我们开始吧.

 

  这个是我们需要转化的多字节字符串:  

  char sText[20] = {"多字节字符串!OK!"};

 

 我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.

  所幸,我们能够确知所需要的数组空间.

 我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:

  DWORD dwNum = MultiByteToWideChar (CP_ACP, 0,sText, -1, NULL, 0);

 

  接下来,我们只需要分配响应的数组空间:

  wchar_t *pwText;

  pwText = new wchar_t[dwNum];

  if(!pwText)

  {

   delete []pwText;

  }

 

  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:

  MultiByteToWideChar (CP_ACP, 0, psText, -1,sText, dwSize);

 

  最后,使用完毕当然要记得释放占用的内存:

  delete []psText;

 

 

  同理,宽字符转为多字节字符的代码如下:  

  wchar_t wText[20] = {L"宽字符转换实例!OK!"};

  DWORD dwNum =WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);

  char *psText;

  psText = new char[dwNum];

  if(!psText)

  {

   delete []psText;

  }

  WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);

  delete []psText;

 

  如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?

   WIN32API里没有符合这种要求的函数,但我们可以自己进行封装:

    

 //-------------------------------------------------------------------------------------

  //Description:

  // This function maps a character string to awide-character (Unicode) string

  //

  //Parameters:

  // lpcszStr: [in] Pointer to the characterstring to be converted

  // lpwszStr: [out] Pointer to a buffer thatreceives 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, LPWSTRlpwszStr, DWORD dwSize)

  {

    // Get therequired size of the buffer that receives the Unicode

    //string.

    DWORDdwMinSize;

    dwMinSize =MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);

 

    if(dwSize< dwMinSize)

    {

    return FALSE;

    }

 

    

    // Convertheaders from ASCII to Unicode.

   MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); 

    returnTRUE;

  }

 

 //-------------------------------------------------------------------------------------

  //Description:

  // This function maps a wide-character string toa new character string

  //

  //Parameters:

  // lpcwszStr: [in] Pointer to the characterstring to be converted

  // lpszStr: [out] Pointer to a buffer thatreceives 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, LPSTRlpszStr, DWORD dwSize)

  {

   DWORD dwMinSize;

   dwMinSize =WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);

   if(dwSize

Setting...-> locale -> default language,选择"中文",然后编译即可.

关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0483s