ANSI - Unicode - UTF8 转换

简介: ANSI - Unicode - UTF8 转换
#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;
}
相关文章
|
5月前
|
存储 自然语言处理 数据可视化
字符集编码(三):Unicode
中国的 GB 编码和日本的 JIS 编码在兼容 ASCII 的同时,又给 ASCII 中的可见字符做了个“全角”编码(原 ASCII 中的字符被称为“半角”字符)。所谓全角和半角字符,在字形和字意上都完全相同,只是全角字符占用宽度(注意不是字形本身的宽度)是半角字符的两倍(据说是为了中英文混排时的美观效果),按照 Unicode 的设计原则,这种问题应该交由文字渲染程序去处理,
50 1
|
存储 JavaScript 程序员
【字符编码详解】ASCII、GB2312、GBK、UTF-8、UTF-16编码与Unicode字符集
【字符编码详解】ASCII、GB2312、GBK、UTF-8、UTF-16编码与Unicode字符集
860 0
|
iOS开发
Unicode 与 UTF-8 编码的转换
Unicode 与 UTF-8 编码的转换
Unicode 与 UTF-8 编码的转换
|
存储 自然语言处理
最基础的ASCII、Unicode、UTF-8一起来多了解点
最基础的ASCII、Unicode、UTF-8一起来多了解点
249 0
最基础的ASCII、Unicode、UTF-8一起来多了解点
|
存储 自然语言处理
字符编码unicode,utf-8和ascii
Ascii编码 由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
1105 0