WideCharToMultiByte 与 MultiByteToWideChar
先看看这篇关于Windows编码的文章:http://blog.csdn.net/shyboy_nwpu/article/details/4431668
再看看这篇关于两个函数参数和用法的说明:http://www.cnblogs.com/wind-net/archive/2012/10/10/2718340.html
为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页。
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个:
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
1. ANSI to Unicode

1 wstring ANSIToUnicode( const string& str )
2 {
3 int len = 0;
4 len = str.length();
5 int unicodeLen = ::MultiByteToWideChar( CP_ACP,
6 0,
7 str.c_str(),
8 -1,
9 NULL,
10 0 );
11 wchar_t * pUnicode;
12 pUnicode = new wchar_t[unicodeLen+1];
13 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
14 ::MultiByteToWideChar( CP_ACP,
15 0,
16 str.c_str(),
17 -1,
18 (LPWSTR)pUnicode,
19 unicodeLen );
20 wstring rt;
21 rt = ( wchar_t* )pUnicode;
22 delete pUnicode;
23 return rt;
24 }

2. Unicode to ANSI

1 string UnicodeToANSI( const wstring& str )
2 {
3 char* pElementText;
4 int iTextLen;
5 // wide char to multi char
6 iTextLen = WideCharToMultiByte( CP_ACP,
7 0,
8 str.c_str(),
9 -1,
10 NULL,
11 0,
12 NULL,
13 NULL );
14 pElementText = new char[iTextLen + 1];
15 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
16 ::WideCharToMultiByte( CP_ACP,
17 0,
18 str.c_str(),
19 -1,
20 pElementText,
21 iTextLen,
22 NULL,
23 NULL );
24 string strText;
25 strText = pElementText;
26 delete[] pElementText;
27 return strText;
28 }

3. UTF-8 to Unicode

1 wstring UTF8ToUnicode( const string& str )
2 {
3 int len = 0;
4 len = str.length();
5 int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
6 0,
7 str.c_str(),
8 -1,
9 NULL,
10 0 );
11 wchar_t * pUnicode;
12 pUnicode = new wchar_t[unicodeLen+1];
13 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
14 ::MultiByteToWideChar( CP_UTF8,
15 0,
16 str.c_str(),
17 -1,
18 (LPWSTR)pUnicode,
19 unicodeLen );
20 wstring rt;
21 rt = ( wchar_t* )pUnicode;
22 delete pUnicode;
23 return rt;
24 }

4. Unicode to UTF-8

1 string UnicodeToUTF8( const wstring& str )
2 {
3 char* pElementText;
4 int iTextLen;
5 // wide char to multi char
6 iTextLen = WideCharToMultiByte( CP_UTF8,
7 0,
8 str.c_str(),
9 -1,
10 NULL,
11 0,
12 NULL,
13 NULL );
14 pElementText = new char[iTextLen + 1];
15 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
16 ::WideCharToMultiByte( CP_UTF8,
17 0,
18 str.c_str(),
19 -1,
20 pElementText,
21 iTextLen,
22 NULL,
23 NULL );
24 string strText;
25 strText = pElementText;
26 delete[] pElementText;
27 return strText;
28
29 }
WideCharToMultiByte 与 MultiByteToWideChar的更多相关文章
- 关于多字节、宽字节、WideCharToMultiByte和MultiByteToWideChar函数的详解
所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码. 而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE. **************************** ...
- WideCharToMultiByte和MultiByteToWideChar函数的用法
为了支持Unicode编码,需要多字节与宽字节之间的相互转换.这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读<Windows核心编程>,总结出正确的用法. ...
- WideCharToMultiByte和MultiByteToWideChar函数的用法(转)
转自:http://www.cnblogs.com/gakusei/articles/1585211.html 为了支持Unicode编码,需要多字节与宽字节之间的相互转换.这两个系统函数在使用时需要 ...
- WideCharToMultiByte和MultiByteToWideChar函数的用法(转载)
出处:http://www.cnblogs.com/gakusei/articles/1585211.html 为了支持Unicode编码,需要多字节与宽字节之间的相互转换.这两个系统函数在使用时需要 ...
- C++中Cstring、wstring 和string互相转换总结
通过前一篇文章<C++中string,wstring,CString的基本概念和用法>,对Cstring.wstring 和string有了一个了解.string是C++提供的标准字符串操 ...
- 小心Windows7的UTF-8代码页
目录 第1章小心Windows7的UTF-8代码页 1 1.1 UTF-16与UTF-8相互转换 1 1.1.1 使用Windows API 1 1.1.2 自己编码 1 1. ...
- Windows代码页、区域
目录 第1章代码页 1 1 代码页 1 1.1 单字节字符集 1 1.2 双字节字符集 1 1.3 多字节字符集 1 1.4 ANSI代码页 2 2 枚举代码页 ...
- Windows字符集的统一与转换
以前也零零散散看过一些字符编码的问题,今天看来这边博客,感觉很多东西都总结在里面,非常值得学习! 一.字符集的历史渊源 在Windows编程时经常会遇到编码转换的问题,一直以来让刚接触的人摸不着头脑. ...
- 几个字符串的误区,以及setlocale函数的使用
转自 http://www.blogjava.net/baicker/archive/2007/08/09/135642.html 转自 http://witmax.cn/character-enco ...
随机推荐
- 大数据实战-Spark实战技巧
1.连接mysql --driver-class-path mysql-connector-java-5.1.21.jar 在数据库中,SET GLOBAL binlog_format=mixed; ...
- SVN同步方式举例 FreeBSD
FreeBSD base 默认安装了svnlite 不需要单独安装SVN 软件 svnlite co svn.freebsd.org/ports/head/ /usr/local/ports -r5 ...
- [WC2014]时空穿梭
这才叫莫比乌斯反演题. 一.题目 点此看题 二.解法 也没有什么好的思路,我们不妨把暴力柿子写出来,我们想枚举直线,但是这道题不能枚举直线的斜率,所以就要用整数来表示直线,我们不妨枚举出发点和终止点的 ...
- .zip爆破
.zip爆破 Python的优化问题 Python在计算密集型任务方面没有明显的多线程优化,多线程更加适合用于处理I/O密集型任务(如网络请求).爆破任务使用顺序执行即可. 编写Python脚本 一个 ...
- 如何学习python爬虫
分享网易云课堂上一个不错的视频教学:http://study.163.com/course/courseMain.htm?courseId=1003285002
- linux 系统用户与用户组管理
关于/etc/passwd和/etc/shadow /etc/passwd 第1个字段为用户名(第一行中的root就是用户名)第2个字段存放的是该账号的口令.第3个字段为一个数字,这个数字代表的用户标 ...
- css实现一个电影卡片
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- JVM之基础概念(运行时数据区域、TLAB、逃逸分析、分层编译)
运行时数据区域 JDK8 之前的内存布局 JDK8 之后的 JVM 内存布局 JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace),以前永 ...
- 攻防世界 reverse pingpong
pingpong XCTF 3rd-BCTF-2017 java层代码很简单: 1 package com.geekerchina.pingpongmachine; 2 3 import andro ...
- MyBatis-Plus Generator自定义模板
相信大家在开发过程中,应该都用过Mybatis-Plus的Generator,但是可能没有自定义过模板并使用. 每个项目都应该有一个从Controller层到Mapper层的通用模板,来去掉哪些简单的 ...