又陷入了Unicode的泥潭,工作中遇到一个模块需要从wchar_t* 转到 char*,而且后续的工作都是基于Char*进行的。网上找了下资料,代码如下:
还有个搞人的东西是VS2005下的ifstream及ofstream函数,打开带有中文路径的文件会失败。
解决方案非常HACK,例如
非简体中文操作系统如下解决:
    
       std::locale prev_loc = std::locale::global( std::locale("chs") ); // 没有这一句的话,文件打开失败
      
       std::ifstream file( "d://测试//test.txt" );
      
       std::locale::global( prev_loc ); // 没有这一句的话,文件中的中文无法输出,且wcout输出中文也失败
    
  
简体中文操作系统下,
    
       std::locale::global( std::locale("") ); // 没有这一句的话,文件打开失败
      
       std::ifstream file( "d://测试//test.txt" );
    
  
--------------------------------------------------------------------------------------------------
    
      
        
          #include <stdio.h> 
          
          #include <windows.h> 
          
          #include <locale.h> 
          
          #define BUFF_SIZE 1024 
          
          
          wchar_t * ANSIToUnicode( const char* str ) 
          
          { 
          
           int textlen ; 
          
           wchar_t * result; 
          
           textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 ); 
          
           result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t)); 
          
           memset(result,0,(textlen+1)*sizeof(wchar_t)); 
          
           MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen ); 
          
           return result; 
          
          } 
          
          
          char * UnicodeToANSI( const wchar_t* str ) 
          
          { 
          
           char* result; 
          
           int textlen; 
          
           textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL ); 
          
           result =(char *)malloc((textlen+1)*sizeof(char)); 
          
           memset( result, 0, sizeof(char) * ( textlen + 1 ) ); 
          
           WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL ); 
          
           return result; 
          
          } 
          
          
          wchar_t * UTF8ToUnicode( const char* str ) 
          
          { 
          
           int textlen ; 
          
           wchar_t * result; 
          
           textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 ); 
          
           result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t)); 
          
           memset(result,0,(textlen+1)*sizeof(wchar_t)); 
          
           MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen ); 
          
           return result; 
          
          } 
          
          
          char * UnicodeToUTF8( const wchar_t* str ) 
          
          { 
          
           char* result; 
          
           int textlen; 
          
           textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL ); 
          
           result =(char *)malloc((textlen+1)*sizeof(char)); 
          
           memset(result, 0, sizeof(char) * ( textlen + 1 ) ); 
          
           WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL ); 
          
           return result; 
          
          } 
          
          /*宽字符转换为多字符Unicode - ANSI*/ 
          
          char* w2m(const wchar_t* wcs) 
          
          { 
          
           int len; 
          
           char* buf; 
          
           len =wcstombs(NULL,wcs,0); 
          
           if (len == 0) 
          
           return NULL; 
          
           buf = (char *)malloc(sizeof(char)*(len+1)); 
          
           memset(buf, 0, sizeof(char) *(len+1)); 
          
           len =wcstombs(buf,wcs,len+1); 
          
           return buf; 
          
          } 
          
          /*多字符转换为宽字符ANSI - Unicode*/ 
          
          wchar_t* m2w(const char* mbs) 
          
          { 
          
           int len; 
          
           wchar_t* buf; 
          
           len =mbstowcs(NULL,mbs,0); 
          
           if (len == 0) 
          
           return NULL; 
          
           buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1)); 
          
           memset(buf, 0, sizeof(wchar_t) *(len+1)); 
          
           len =mbstowcs(buf,mbs,len+1); 
          
           return buf; 
          
          } 
          
          
          char* ANSIToUTF8(const char* str) 
          
          { 
          
           return UnicodeToUTF8(ANSIToUnicode(str)); 
          
          } 
          
          
          char* UTF8ToANSI(const char* str) 
          
          { 
          
           return UnicodeToANSI(UTF8ToUnicode(str)); 
          
          } 
        
      
    
  


 
     
					 
					