C++ ANSI 与 utf-8转换




  1. //UTF8转ANSI  
  2. void UTF8toANSI(CString &strUTF8)  
  3. {  
  4.     //获取转换为多字节后需要的缓冲区大小,创建多字节缓冲区  
  5.     UINT nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,NULL,NULL);  
  6.     WCHAR *wszBuffer = new WCHAR[nLen+1];  
  7.     nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,wszBuffer,nLen);  
  8.     wszBuffer[nLen] = 0;  
  9.   
  10.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);  
  11.     CHAR *szBuffer = new CHAR[nLen+1];  
  12.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  13.     szBuffer[nLen] = 0;  
  14.       
  15.     strUTF8 = szBuffer;  
  16.     //清理内存  
  17.     delete []szBuffer;  
  18.     delete []wszBuffer;  
  19. }  
//UTF8转ANSI
void UTF8toANSI(CString &strUTF8)
{
    //获取转换为多字节后需要的缓冲区大小,创建多字节缓冲区
    UINT nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,NULL,NULL);
    WCHAR *wszBuffer = new WCHAR[nLen+1];
    nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,wszBuffer,nLen);
    wszBuffer[nLen] = 0;

    nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);
    CHAR *szBuffer = new CHAR[nLen+1];
    nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);
    szBuffer[nLen] = 0;

    strUTF8 = szBuffer;
    //清理内存
    delete []szBuffer;
    delete []wszBuffer;
}
  1. //ANSI转UTF8  
  2. void ANSItoUTF8(CString &strAnsi)  
  3. {  
  4.     //获取转换为宽字节后需要的缓冲区大小,创建宽字节缓冲区,936为简体中文GB2312代码页  
  5.     UINT nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,NULL,NULL);  
  6.     WCHAR *wszBuffer = new WCHAR[nLen+1];  
  7.     nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,wszBuffer,nLen);  
  8.     wszBuffer[nLen] = 0;  
  9.     //获取转为UTF8多字节后需要的缓冲区大小,创建多字节缓冲区  
  10.     nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);  
  11.     CHAR *szBuffer = new CHAR[nLen+1];  
  12.     nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  13.     szBuffer[nLen] = 0;  
  14.       
  15.     strAnsi = szBuffer;  
  16.     //内存清理  
  17.     delete []wszBuffer;  
  18.     delete []szBuffer;  
  19. }  
//ANSI转UTF8
void ANSItoUTF8(CString &strAnsi)
{
    //获取转换为宽字节后需要的缓冲区大小,创建宽字节缓冲区,936为简体中文GB2312代码页
    UINT nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,NULL,NULL);
    WCHAR *wszBuffer = new WCHAR[nLen+1];
    nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,wszBuffer,nLen);
    wszBuffer[nLen] = 0;
    //获取转为UTF8多字节后需要的缓冲区大小,创建多字节缓冲区
    nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);
    CHAR *szBuffer = new CHAR[nLen+1];
    nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);
    szBuffer[nLen] = 0;

    strAnsi = szBuffer;
    //内存清理
    delete []wszBuffer;
    delete []szBuffer;
}


自己改的c版本,测试可用:

static void UTF8toANSI(char *strUTF8,char*out_ansi)
{
//获取转换为多字节后需要的缓冲区大小,创建多字节缓冲区
UINT nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, NULL, 0);
WCHAR wszBuffer = (WCHAR)malloc((nLen+1)*sizeof(WCHAR));
nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, wszBuffer, nLen);
wszBuffer[nLen] = 0;

nLen = WideCharToMultiByte(936, 0, wszBuffer, -1, NULL, 0, NULL, NULL);
nLen = WideCharToMultiByte(936, 0, wszBuffer, -1, out_ansi, nLen, NULL, NULL);
out_ansi[nLen] = 0;

}

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值