norains的专栏

非淡泊无以明志 非宁静无以致远

norains的公告
各位兄弟姐妹如果有任何问题,欢迎在Blog留言或是Email至norains#163.com,但请勿发送站内消息或是在个人空间留言,因为本人比较愚钝,实在不知通过何种途径能迅速获取以上两种方式之消息.:-)
最近评论
zhengguodun:博主,麻烦你看看我以下的调用有问题吗?之前的问题都解决了,现在运行的时候似乎没有反应,以下代码我放在BOOL CMenu2Dlg::OnInitDialog()里面
/////////////////////////////////////////////////////////////////////////////////////////////////////////////……
zhengguodun:谢谢博主
已经可以编译通过了,sdk没错,只是不知道为什么我这里运行需要指定那些头文件和lib文件的目录。
不过在wince下运行时又出现了问题了,提示找不到程序或它的某一个组件。请确认路径和文件名正确并且所需要的库全部可用
tian_maer:现在我把我自己利用SoundBase录音类建立的evc下的录音程序步骤说明一下,请大家参考】
1、首先建立在evc下的WCE应用程序项目luyin,选择对话框项目,
2、在项目的头文件和源文件目录里添加SOundBase.cpp和SoundBase.h文件,
3,在自己建立的CluyinDlg.cpp里面添加包含文件SoundBase.h,然后添加全局化的实例对……
zhengguodun:正在试着用这个类
请问使用时还需要其他的配置吗?
提示找不到streams.h
tian_maer:多谢博主的帮忙!
谢谢!!!!!
文章分类
收藏
    相册
    动漫
    文章图片
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 MultiByteToWideChar和WideCharToMultiByte用法详解收藏

    新一篇: CD转换高品质MP3,其实也可以很简单

    //========================================================================
    //TITLE:
    //    MultiByteToWideChar和WideCharToMultiByte用法详解
    //AUTHOR:
    //    norains
    //DATE:
    //    第一版:Monday  25-December -2006
    //    增补版:Wednesday 27-December -2006
    //    修订版:Wednesday 14-March-2007 (修正之前的错误例子)
    //    再次修订版:Tuesday 18-September-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, sText, -1, pwText, dwNum);
     
      最后,使用完毕当然要记得释放占用的内存:
      delete []pwText;
     
     
      同理,宽字符转为多字节字符的代码如下:  
      wchar_t wText[20] = {L"宽字符转换实例!OK!"};
      DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);
      char *psText;
      psText = new char[dwNum];
      if(!psText)
      {
       delete []psText;
      }
      WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);
      delete []psText;
     
       如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
       WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:
         
      //-------------------------------------------------------------------------------------
      //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;
      }
     
     
      使用方法也很简单,示例如下:
      wchar_t wText[10] = {L"函数示例"};
      char sText[20]= {0};
      WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
      MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));
     
      这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.

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

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

    发表于 @ 2006年12月25日 23:38:00|评论(loading...)|编辑

    旧一篇: 轻松消除贴图闪烁

    评论

    #coder0621 发表于2007-02-05 16:36:46  IP: 60.215.89.*
    垃圾!
    连MultiByteToWideChar和WideCharToMultiByte者两个函数的参数都没搞明白就在这里胡说。真佩服你的勇气!
    #norains 发表于2007-02-05 23:24:31  IP: 218.17.92.*
    coder0621 :不知道这位朋友"连MultiByteToWideChar和WideCharToMultiByte者两个函数的参数都没搞明白"指的是哪些错误? 因为这运用这两个函数的代码是MSDN上直接参照的,并且也经过验证了的.不知道这位朋友是不是把我封装的这两个函数:MByteToWChar()和WCharToMByte(),与API函数:MultiByteToWideChar()和WideCharToMultiByte()搞混淆了?如果不是,还望多多指教!
    #qyjmcse 发表于2007-02-20 17:53:42  IP: 211.162.215.*
    我觉得作者应该看看msdn里的MultiByteToWideChar和WideCharToMultiByte这两个函数的用法.
    请问你在vs2005测试过吗?下面的能通过编译吗?
    DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, wText, -1, NULL, 0);

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

    老天,我在这里已经测试了半天你的代码了,怎样测都有问题,我是个初学者,还以为可以借此得到帮助的,结果白白浪费了我那么多的时间
    #shxhark 发表于2007-02-23 20:18:41  IP: 124.89.85.*
    这个问题把我难住了。
    #norains 发表于2007-02-25 11:57:11  IP: 218.18.210.*
    to qyjmcse: 这位朋友估计可能因为时间紧迫没有仔细看我的文章,因为文章初始我已经表明该代码的正常编译运行环境是"EVC4.0 + Standard SDK", 故无法保证在别的编译环境中也能正常编译通过
    #youkar 发表于2007-03-12 11:14:26  IP: 61.187.56.*
    MultiByteToWideChar

    This function maps a character string to a wide-character (Unicode) string.

    你是不是把两个函数功能搞反了?
    #phyne 发表于2007-03-13 18:02:22  IP:
    真服了作者,函数完全弄反,我以前用过这个函数,如果没用过的谁看了你的文章简直得晕死了。
    #norains 发表于2007-03-14 22:43:59  IP: 219.133.148.*
    谢谢youkar 和 phyne ! 例子中确实是把这两个函数给搞混了,现在已经更正
    #fzx_qd 发表于2007-09-18 11:03:24  IP: 221.6.45.*
    MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);
    psTest, sTest: 参数反了
    #norains 发表于2007-09-18 11:45:08  IP: 219.133.137.*
    TO fzx_qd :谢谢!确实反了,已修正.
    #jiess 发表于2007-10-22 16:03:44  IP: 58.61.99.*
    这篇文章写得真不错,强烈BS那么只知COPY不动脑的高手.
    PS:
    默认语言不一定要为"中文".只要支持"中文"就行了.
    1.LOCALS选择中文
    2.CODEPAGE选择中文
    #zaodt 发表于2007-10-30 11:50:58  IP: 60.176.191.*
    圣人都会犯错,何况是凡人!

    孔子还鄙视生产劳动!

    有错误,指证出来即可。

    另外,骂别人的同时,其实是在贬低自己!
    #norains 发表于2007-10-30 23:06:43  IP: 219.133.148.*
    to jiess :看起来应该也是一个非常不错的解决方法,不过我还没确切尝试验证过,如果有遇到相同问题的朋友可以按jiess的方法试试看.
    #stevenW 发表于2007-11-24 23:31:41  IP: 218.14.135.*
    laji,以其昏昏,只能使人昭昭
    #coder0621 发表于2007-11-27 14:03:15  IP: 219.146.150.*
    这次是来道歉的,为我的莽撞言辞。

    当时只是看到 lz所说的和自己按照msdn所实践的完全不一样,看完文章后反而更晕了,有种被愚弄的感觉,一生气说了几句不理智的话。正如 zaodt所教训的,圣人都会犯错,何况是凡人!吾在此说声对不起。

    另外,我想提点建议,发表文章这种看似小事的大事,关系到很多人的时间和精力,正确性是一定要有保证的。

    再次向lz说声sorry !!!
    #疯子阿虹 发表于2007-11-30 13:16:03  IP: 124.42.2.*
    BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)

    这个函数写的根本没有任何意义!!!!!
    #guoke 发表于2007-12-11 11:35:32  IP: 121.35.49.*
    lz,那个MultiByteToWideChar (CP_ACP, 0, Resbuf, -1, NULL, OFFSET);
    第五个参数为NULL的时候,不能检测以英文字母开头的数据,不知道lz有没有测试过
    #guoke 发表于2007-12-11 11:39:47  IP: 121.35.49.*
    现在用到这个函数,DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
    当sText里面的内容是以英文字母打头时,检测到的dwNum = 0;
    很是郁闷,难道这么受局限吗这个和函数,想和lz讨论一下....
    2007-12-11 12:08:10作者回复
    我用下面这段代码进行测试:char sText[] = {"Yes,测试一下"};DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0); 在我Device上测试,dwNum是9,数值正确.Device承载的是Wince5.0,系统的default language是中文.而相同的代码,在WinCE 4.2的标准模拟器(即安装EVC4.0时安装的default language为英文的模拟器)上进行测试,dwNum为13. 很明显,在后者的测试环境中所获得的数值是错误的. 所以你的返回值为0估计应该和所用的模拟器有关.<br /><br />
    #guoke 发表于2007-12-12 13:52:15  IP: 121.34.152.*
    我的模拟器是EVC4.0安装的win32(WCE emulator) 上测试的为0
    lz说的原因有可能,xxy,我现在用了一个固定的数据来保存转换过后的字符,是浪费了点,保险啊
    #yhforchina 发表于2008-04-10 09:57:48  IP: 58.19.119.*
    其他的没细看,不过这句:
    MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
    lz你这样用有问题吧?只有当szA声明为一个数组时sizeof(szA)才返回该数组所占的字节数,否则只会返回LPSTR 这个指针所占的字节数。你应该指明szA应该声明为 wchar_t szA[n].
    2008-04-10 10:13:16作者回复
    文中szA声明的是数组,如果是指针的话,我习惯与在前面再加个p,比如pszA。
    #tccqs 发表于2008-05-13 15:53:02  IP: 218.0.4.*
    强烈支持一下
    #xinyu391 发表于2008-06-05 14:51:27  IP: 222.66.175.*
    不知,是不是垃圾
    这个片文章在这里也有
    http://www.cppblog.com/sunraiing9/archive/2007/03/21/20281.html
    不知那个是原创,不知哪个shabi 偷别人的文章,不注明 “引用”
    #bobo 发表于2008-06-06 10:17:23  IP: 222.66.38.*
    ls,自己去比较文章发表时间,看下面的评论,动脑子想想。

    还有,看任何人家开放的资源,希望能抱着学习,尊敬的心态,别把自己当大爷
    #orichisonic 发表于2008-06-13 15:39:10  IP: 61.172.206.*
    正在看公司的系统服务,还是有帮助的,学习是应该咬文嚼字,但是既然是参考,难免会犯错误的
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © norains