字符串处理 - ANSI - Unicode - UTF8 转换

字符串处理 - ANSI - Unicode - UTF8 转换
[C语言]字符串处理 - ANSI - Unicode - UTF8 转换
2008-11-4: 使用MultiByteToWideChar和WideCharToMultiByte写的4个ANSI <-> Unicode <-> UTF-8 相互转换的函数。
2008-11-5: 使用C语言标准库mbstowcs和wcstombs写的w2m和m2w两个函数,分别对应ANSI <-> Unicode 相互转换。
2008-11-8: 包装一下 ANSI <-> UTF-8 。
#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,  0sizeof( 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,  0sizeof( 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,  0sizeof( 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,  0sizeof( 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));
}

int main()
{
      /*使用wcstombs和mbstowcs之前必须调用setlocale,以便决定内码*/
     setlocale(LC_ALL, ".936");
      /*假定有一个Unicode(UTF-16LE)编码的文件,将其打开,重新编码为ANSI,写入aa.txt中,再继续编码回Unicode,写入aw.txt中*/
      /*如果不存在a.txt文件,则程序出错,没有做错误处理*/
      char* filename =  "a.txt";
      char* filenamea =  "aa.txt";
      char* filenamew =  "aw.txt";
      FILE*     input=fopen( filename,  "rb"); 
      FILE*     inputa=fopen( filenamea,  "wb"); 
      FILE*     inputw=fopen( filenamew,  "wb"); 
      wchar_t * buf ;
      /*BOE设置,UTF-16LE的BOE为FEFF,如果不先将其读取出来,wcstombs会调用失败*/
     fgetwc(input);
     fputwc( 0xFEFF,inputw);
      /*开始读取文件*/
      while(!feof(input))
     {
        buf = ( wchar_t *)malloc( sizeof( wchar_t)*BUFF_SIZE)         ;
        memset(buf,     0sizeof( wchar_t) * BUFF_SIZE );
        fgetws(buf,    BUFF_SIZE,    input);
        fputs(w2m(buf),    inputa);
        fputws(m2w(w2m(buf)),    inputw);
     }
      /*后续处理*/
     fclose(input);
     fclose(inputa);
     fclose(inputw);
     free(buf);

      return  0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值