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

Posted 风的哀伤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理 - 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; 
}

以上是关于字符串处理 - ANSI - Unicode - UTF8 转换的主要内容,如果未能解决你的问题,请参考以下文章

Windows Internals 笔记——字符和字符串处理

Windows核心编程之核心总结(第二章 字符和字符串处理)(2018.5.27)

ANSI码和UNICODE码

UNICODE与ANSI的区别

UNICODE与ANSI的区别

字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)