WideCharToMultiByte和MultiByteToWideChar函数的用法

为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
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
24  return  rt;
25 }

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
24  return  rt;
25 }

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 }
时间: 2024-10-10 21:54:25

WideCharToMultiByte和MultiByteToWideChar函数的用法的相关文章

关于多字节、宽字节、WideCharToMultiByte和MultiByteToWideChar函数的详解

所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码. 而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE. ********************************第一个就是宽字符到多字节字符转换函数,函数原型如下: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, in

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差.其结果的单位由interval 参数给出.interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同. mysql> SELECT TIMESTAMPDIFF(MONTH,'200

【转】oracle的substr函数的用法

[转]oracle的substr函数的用法 oracle的substr函数的用法 取得字符串中指定起始位置和长度的字符串   substr( string, start_position, [ length ] ) 如:     substr('This is a test', 6, 2)     would return 'is'     substr('This is a test', 6)     would return 'is a test'     substr('TechOnThe

Oracle trunc()函数的用法

--Oracle trunc()函数的用法 /**************日期  TRUNC()函数没有秒的精确 ********************/ select sysdate from dual --当时日期 select trunc(sysdate) from dual select trunc(sysdate ,'DD') from dual --今天日期 select trunc(sysdate,'d')+7 from dual --本周星期日 select trunc(sys

C中的时间函数的用法

C中的时间函数的用法    这个类展示了C语言中的时间函数的常用的用法. 源代码: #include <ctime>#include <iostream> using namespace std; class MyTime{public:    MyTime() { mPTime = 0; mStLocalTime = 0; mStGMTTime = 0; }    ~MyTime() {}; //time_t time(time_t * timer) 返回自1970年1月1日00

嵌入式之---常用模板函数(用法说明函数、参数解析函数)

主要内容:嵌入式常用模板函数(用法说明函数.参数解析函数) /*显示参数列表*/ void usage() {     printf("usage: server [-p:x] [-i:IP] [-o]\n\n");     printf("       -p:x      Port number to listen on\n");     printf("       -i:str    Interface to listen on\n");

awk中split函数的用法

The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep. time=12:34:56 echo $time | awk '{split($0,a,":" ); print a[1]}' 12   echo $time | awk '{split($0,a,":" ); print a[3]}' 34   echo $time | awk

ecl函数的用法

相关函数 fork, execle, execlp, execv, execve, execvp Windows下头文件 #include <process.h> Linux下头文件 #include <unistd.h> 函数定义 int execl(const char *path, const char *arg, ...); 函数说明 execl()其中后缀"l"代表list也就是参数列表的意思,第一参数path字符指针所指向要执行的文件路径, 接下来的

setdefault函数的用法及个人理解

setdefault函数的用法及理解dict.setdefault(key, default=None) 功能:如果键不存在于字典中,将会添加该键并将default的值设为该键的默认值,如果键存在于字典中,将读出该键原来对应的值,default的值不会覆盖原来已经存在的键的值. 参数:key----要查找的键default-----查找的键不存在时用于设置的默认值 使用方法示例:(以下使用方法是我理解setdefault函数的过程)方法一:给字典中不存在的键赋值为默认值None>>> E