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

http://blog.csdn.net/sandro_zhang/article/details/7514413


最近发现一个比较全的字符串编码转换的方法,记录如下:

[cpp]  view plain copy
  1. 2008-11-4: 使用MultiByteToWideChar和WideCharToMultiByte写的4个ANSI <-> Unicode <-> UTF-8 相互转换的函数。  
  2. 2008-11-5: 使用C语言标准库mbstowcs和wcstombs写的w2m和m2w两个函数,分别对应ANSI <-> Unicode 相互转换。  
  3. 2008-11-8: 包装一下 ANSI <-> UTF-8 。  
  4. #include <stdio.h>  
  5. #include <windows.h>  
  6. #include <locale.h>  
  7. #define BUFF_SIZE 1024  
  8.   
  9. wchar_t * ANSIToUnicode( const char* str )  
  10. {  
  11.      int textlen ;  
  12.      wchar_t * result;  
  13.      textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 );   
  14.      result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));   
  15.      memset(result,0,(textlen+1)*sizeof(wchar_t));   
  16.      MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );   
  17.      return result;   
  18. }  
  19.   
  20. char * UnicodeToANSI( const wchar_t* str )  
  21. {  
  22.      char* result;  
  23.      int textlen;  
  24.      textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );  
  25.      result =(char *)malloc((textlen+1)*sizeof(char));  
  26.      memset( result, 0, sizeof(char) * ( textlen + 1 ) );  
  27.      WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );  
  28.      return result;  
  29. }  
  30.   
  31. wchar_t * UTF8ToUnicode( const char* str )  
  32. {  
  33.      int textlen ;  
  34.      wchar_t * result;  
  35.      textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 );   
  36.      result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));   
  37.      memset(result,0,(textlen+1)*sizeof(wchar_t));   
  38.      MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );   
  39.      return result;   
  40. }  
  41.   
  42. char * UnicodeToUTF8( const wchar_t* str )  
  43. {  
  44.      char* result;  
  45.      int textlen;  
  46.      textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );  
  47.      result =(char *)malloc((textlen+1)*sizeof(char));  
  48.      memset(result, 0, sizeof(char) * ( textlen + 1 ) );  
  49.      WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );  
  50.      return result;  
  51. }  
  52. /*宽字符转换为多字符Unicode - ANSI*/  
  53. char* w2m(const wchar_t* wcs)  
  54. {  
  55.       int len;  
  56.       char* buf;  
  57.       len =wcstombs(NULL,wcs,0);  
  58.       if (len == 0)  
  59.           return NULL;  
  60.       buf = (char *)malloc(sizeof(char)*(len+1));  
  61.       memset(buf, 0, sizeof(char) *(len+1));  
  62.       len =wcstombs(buf,wcs,len+1);  
  63.       return buf;  
  64. }  
  65. /*多字符转换为宽字符ANSI - Unicode*/  
  66. wchar_t* m2w(const char* mbs)  
  67. {  
  68.       int len;  
  69.       wchar_t* buf;  
  70.       len =mbstowcs(NULL,mbs,0);  
  71.       if (len == 0)  
  72.           return NULL;  
  73.       buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1));  
  74.       memset(buf, 0, sizeof(wchar_t) *(len+1));  
  75.       len =mbstowcs(buf,mbs,len+1);  
  76.       return buf;  
  77. }  
  78.   
  79. char* ANSIToUTF8(const char* str)  
  80. {  
  81.      return UnicodeToUTF8(ANSIToUnicode(str));  
  82. }  
  83.   
  84. char* UTF8ToANSI(const char* str)  
  85. {  
  86.      return UnicodeToANSI(UTF8ToUnicode(str));  
  87. }  
  88.   
  89. int main()  
  90. {  
  91.      /*使用wcstombs和mbstowcs之前必须调用setlocale,以便决定内码*/  
  92.      setlocale(LC_ALL,".936");  
  93.      /*假定有一个Unicode(UTF-16LE)编码的文件,将其打开,重新编码为ANSI,写入aa.txt中,再继续编码回Unicode,写入aw.txt中*/  
  94.      /*如果不存在a.txt文件,则程序出错,没有做错误处理*/  
  95.      char* filename = "a.txt";  
  96.      char* filenamea = "aa.txt";  
  97.      char* filenamew = "aw.txt";  
  98.      FILE*     input=fopen( filename, "rb");   
  99.      FILE*     inputa=fopen( filenamea, "wb");   
  100.      FILE*     inputw=fopen( filenamew, "wb");   
  101.      wchar_t * buf ;  
  102.      /*BOE设置,UTF-16LE的BOE为FEFF,如果不先将其读取出来,wcstombs会调用失败*/  
  103.      fgetwc(input);  
  104.      fputwc(0xFEFF,inputw);  
  105.      /*开始读取文件*/  
  106.      while(!feof(input))  
  107.      {  
  108.         buf = (wchar_t *)malloc(sizeof(wchar_t)*BUFF_SIZE)         ;  
  109.         memset(buf,    0, sizeof(wchar_t) * BUFF_SIZE );  
  110.         fgetws(buf,    BUFF_SIZE,    input);  
  111.         fputs(w2m(buf),    inputa);  
  112.         fputws(m2w(w2m(buf)),    inputw);  
  113.      }  
  114.      /*后续处理*/  
  115.      fclose(input);  
  116.      fclose(inputa);  
  117.      fclose(inputw);  
  118.      free(buf);  
  119.   
  120.      return 0;  
  121. }  

感谢: http://hi.baidu.com/end2012/blog/item/9ff286df5d57bc53cdbf1ab9.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值