ANSI - Unicode UTF16 - Unicode UTF8 转换

本文介绍如何在Windows环境下实现不同字符集间的转换,包括从wchar_t*到char*的转换,并提供了解决VS2005中ifstream及ofstream无法正确处理中文路径问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

      又陷入了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));
 }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值