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;
}
相关文章
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a
|
6月前
|
C++
【C++】std::string 转换成非const类型 char* 的三种方法记录
【C++】std::string 转换成非const类型 char* 的三种方法记录
129 0
|
12月前
char[] 转String时的陷阱
char[] 转String时的陷阱
38 1
|
12月前
|
C++
《C++避坑神器·十四》项目路径获取及WCHAR 和char* 的相互转换
《C++避坑神器·十四》项目路径获取及WCHAR 和char* 的相互转换
76 0
|
存储 自然语言处理 Java
Java_9_为何要将_String_的底层实现由_char[]_改成了_byte[]_?
Java_9_为何要将_String_的底层实现由_char[]_改成了_byte[]_?
|
存储 Java 索引
String和Char的区别
String和Char的区别
469 1
|
Java
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
93 0
编写一个程序,链接两个字符串字面常量,将结果保存在一个动态分配的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[]
120 0