wchar、char、CString、string

简介: wchar、char、CString、string

CString(wchar) 转char*---------------

char *p;
 DWORD dwNum =   WideCharToMultiByte(CP_OEMCP,NULL,Path.GetBuffer(),-1,NULL,0,NULL,FALSE);
 p   = new   char[dwNum];
 ZeroMemory(p,dwNum);
 if(!p)
 {
  delete   []p;
 }
 WideCharToMultiByte   (CP_OEMCP,NULL,Path.GetBuffer(),-1,p,dwNum,NULL,FALSE);

为了支持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;
}
相关文章
|
6月前
|
C++
《C++避坑神器·十四》项目路径获取及WCHAR 和char* 的相互转换
《C++避坑神器·十四》项目路径获取及WCHAR 和char* 的相互转换
35 0
|
6月前
char[] 转String时的陷阱
char[] 转String时的陷阱
22 1
|
7月前
|
存储 自然语言处理 Java
Java_9_为何要将_String_的底层实现由_char[]_改成了_byte[]_?
Java_9_为何要将_String_的底层实现由_char[]_改成了_byte[]_?
|
9月前
|
Java
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
56 0
|
10月前
|
存储 Java 索引
String和Char的区别
String和Char的区别
269 1
|
11月前
编写一个程序,链接两个字符串字面常量,将结果保存在一个动态分配的char数组中,重写这个程序,连接两个标准string对象
编写一个程序,链接两个字符串字面常量,将结果保存在一个动态分配的char数组中,重写这个程序,连接两个标准string对象
【剑指offer知识点】List转int[],List转String,String转int,char[]转String,String 转char[],List转String[]
【剑指offer知识点】List转int[],List转String,String转int,char[]转String,String 转char[],List转String[]
100 0
|
JavaScript Java 数据库
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
294 0
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
|
8月前
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
71 0
|
21天前
|
存储 数据库
5. CHAR和VARCHAR的区别?
`CHAR`和`VARCHAR`在数据库中有所不同:`CHAR`长度固定,用空格填充,存储效率高,英文占1字节,汉字占2字节;而`VARCHAR`长度可变,节省空间,英文和汉字都占2字节。
15 0