为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
下面是代码实现:
1.  ANSI to Unicode
wstring ANSIToUnicode( const string& str )
{
 int  len = 0;
 len = str.length();
 int  unicodeLen = ::MultiByteToWideChar( CP_ACP,
            0,
            str.c_str(),
            -1,
            NULL,
            0 ); 
 wchar_t *  pUnicode; 
 pUnicode = new  wchar_t[unicodeLen+1]; 
 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 
 ::MultiByteToWideChar( CP_ACP,
         0,
         str.c_str(),
         -1,
         (LPWSTR)pUnicode,
         unicodeLen ); 
 wstring  rt; 
 rt = ( wchar_t* )pUnicode;
 delete  pUnicode;
 
 return  rt; 
}
2.  Unicode to ANSI
string UnicodeToANSI( const wstring& str )
{
 char*     pElementText;
 int    iTextLen;
 // wide char to multi char
 iTextLen = WideCharToMultiByte( CP_ACP,
         0,
         str.c_str(),
         -1,
         NULL,
         0,
NULL,
         NULL );
 pElementText = new char[iTextLen + 1];
 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
 ::WideCharToMultiByte( CP_ACP,
         0,
         str.c_str(),
         -1,
         pElementText,
         iTextLen,
         NULL,
         NULL );
 string strText;
 strText = pElementText;
 delete[] pElementText;
 return strText;
}
3.  UTF-8 to Unicode
wstring UTF8ToUnicode( const string& str )
{
 int  len = 0;
 len = str.length();
 int  unicodeLen = ::MultiByteToWideChar( CP_UTF8,
            0,
            str.c_str(),
            -1,
            NULL,
            0 ); 
 wchar_t *  pUnicode; 
 pUnicode = new  wchar_t[unicodeLen+1]; 
 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 
 ::MultiByteToWideChar( CP_UTF8,
         0,
         str.c_str(),
         -1,
         (LPWSTR)pUnicode,
         unicodeLen ); 
 wstring  rt; 
 rt = ( wchar_t* )pUnicode;
 delete  pUnicode;
 
 return  rt; 
}
4.  Unicode to UTF-8   
string UnicodeToUTF8( const wstring& str )
{
 char*     pElementText;
 int    iTextLen;
 // wide char to multi char
 iTextLen = WideCharToMultiByte( CP_UTF8,
         0,
         str.c_str(),
         -1,
         NULL,
         0,
         NULL,
         NULL );
 pElementText = new char[iTextLen + 1];
 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
 ::WideCharToMultiByte( CP_UTF8,
         0,
         str.c_str(),
         -1,
         pElementText,
         iTextLen,
         NULL,
         NULL );
 string strText;
 strText = pElementText;
 delete[] pElementText;
 return strText;

}

====================================================================

转换代码:

//Uniocde 和 ASCII 的转换 bFlg==TRUE:UNICODE->ASCII  FLASE:ASCII->UNICODE
//bIsAlloc为自动申请内存/手动申请内存 如果是自动模式需要调用者自己释放 如HeapFree(GetProcessHeap(), 0, pcName); 手动模式则是创建者自己释放
void Unicode2Ascii(PWCHAR *pwStr, PCHAR *pcStr, BOOL bFlg, BOOL bIsAlloc=TRUE)
{int nSizeW, nSizeC;//UNICODE 转 ASCIIif(bFlg){nSizeW=wcslen(*pwStr);nSizeC=WideCharToMultiByte(CP_ACP, 0, *pwStr, nSizeW, NULL, 0, NULL, NULL);//自动申请内存if(bIsAlloc){*pcStr = (CHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nSizeC + 1) * sizeof(CHAR));}//手动申请内存else{memset(*pcStr, 0, (nSizeC + 1) * sizeof(CHAR));}WideCharToMultiByte(CP_ACP, 0, *pwStr, nSizeW, *pcStr, nSizeC * sizeof(CHAR), NULL, NULL);}//ASCII 转 UNICODEelse{nSizeC=MultiByteToWideChar(CP_ACP, 0, *pcStr, -1, NULL, 0);if(bIsAlloc){*pwStr= (PWCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nSizeC+1) * sizeof(WCHAR));}else{memset(*pwStr, 0, (nSizeC+1) * sizeof(WCHAR));}MultiByteToWideChar(CP_ACP, 0, *pcStr, -1, *pwStr, nSizeC * sizeof(WCHAR));}
}

WideCharToMultiByte和MultiByteToWideChar函数的用法(ascii转unicode unicode转ascii)相关推荐

  1. WideCharToMultiByte和MultiByteToWideChar函数的用法(转)

    转自:http://www.cnblogs.com/gakusei/articles/1585211.html 为了支持Unicode编码,需要多字节与宽字节之间的相互转换.这两个系统函数在使用时需要 ...

  2. matlab fopen函数的用法,matlab中关于fread函数的用法

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:matlab中关于fread函数的用法 问题详情:用fread打开一个时,需要不需要把开放在某个特回答:必须在Matlab可以搜索的 ...

  3. python中lower()函数的用法

    python字符串函数用法大全链接 lower()函数 描述:将字符串中的所有大写字母转换为小写字母. 语法:str.lower()  -> str  返回字符串 程序示例: str1 = &q ...

  4. rsort php,php中rsort函数实例用法

    在讲到升序的数组方法后,那么对应的就会出现降序的方法.在我们正式揭晓方法之前,大家已经学习了sort函数的用法,那么对应的降序函数名称就是rsort() .两个函数在结构语法上都非常相似,下面我们就r ...

  5. c语言get()的作用,c语言get函数的用法有哪些

    C语言中gets从标准输入设备读字符串函数,可以无限读取,不会判断上限,今天学习啦小编在这里为大家介绍C语言get函数的用法,欢迎大家阅读! c语言get函数的用法:int getc(FILE *st ...

  6. C语言中itoa和atoi函数的用法

    1.itoa函数的用法 (1) 函数说明 itoa是广泛应用的非标准C语言扩展函数.由于它不是标准C语言函数,所以不能在所有的编译器中使用.但是,大多数的编译器(如Windows上 的)通常在< ...

  7. MySQL字符串处理函数的用法及使用举例

    MySQL字符串处理函数的用法及使用举例 MySQL提供了处理字符串的相关函数.现对这些函数的功能及用法进行介绍并举例. 创建数据表emp并输入数据: create table customer(c_ ...

  8. python float函数是什么,Python float函数实例用法

    Python float函数实例用法 我们知道数字有很多种类型,比如整数.浮点数.在字符串值的讨论上,我们会需要用浮点值的形式,那么就需要函数来进行转换.float函数的功能正是如此,能够对其中的数值 ...

  9. c语言time函数的作用,c语言中time函数的用法

    c语言中time函数的用法 c语言中time函数的用法的用法你知道吗?下面应届毕业生小编就跟你们详细介绍下c语言中time函数的用法的用法,希望对你们有用. c语言中time函数的用法的用法如下: 头 ...

最新文章

  1. Fibonacci数列的java实现
  2. Mysql高级调优篇——第四章:Sql实战调优场景剖析(下)
  3. Computer Organization and Design--计组作业习题(1)
  4. 【讲●解】KMP算法
  5. GPU Gems1 - 10 电影级的光照
  6. outlook附件大小限制_如何在Outlook中调整大图片附件的大小
  7. 再谈borland与MS对BUG的不同态度~
  8. mssql 跨库获取mysql
  9. python鞋子_python
  10. oracle之 监听器无法启动的几个原因总结
  11. 企业级PHP后台开发框架
  12. 几种基本门电路有关符号内容汇总
  13. BOCHS 模拟器和我的启动代码
  14. 英语单词词性顺口溜_英语十大词性顺口溜
  15. Python语言程序设计前言
  16. win10c盘扩容_【电脑维护宝典】C盘不再亮起红灯!
  17. uniapp开发h5微信授权登录(详细教程)
  18. 易經大意(6) 三和 韓長庚 著
  19. 7-4 BCD解密 (10分)
  20. 自己封装的一个JS分享组件

热门文章

  1. Vue 中多个元素、组件的过渡,及列表过渡
  2. 30天敏捷生活(9-11):调整30天的节奏
  3. k8s v1.9.6 超详细搭建步骤
  4. bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼
  5. 方法重载-Overload
  6. UML 2.0(装载)
  7. 自定义Title(可以实现类似于携程网上价格的显示方式)
  8. python中的赋值和深浅拷贝
  9. day20-自定义分页2
  10. 新书-JavaScript高级程序设计:第2版(预订中,估价)