ANSI - Unicode - UTF8 转换

举报
清雨小竹 发表于 2022/09/25 03:04:14 2022/09/25
【摘要】 #include <stdio.h> #include <windows.h> #include <locale.h> #define BUFF_SIZE 1024 wchar_t * ANSIToUnicode( const cha...
#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));
}

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,    0, sizeof( 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;
}

文章来源: zzzili.blog.csdn.net,作者:清雨小竹,版权归原作者所有,如需转载,请联系作者。

原文链接:zzzili.blog.csdn.net/article/details/8265405

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。